Skip to content

09.1 — refresh() 启动流程

**返回 进阶源码索引**


1. Spring 启动流程 — refresh() 12 步

12 步详解

方法核心动作关键点
1prepareRefresh()设置启动时间、激活状态、初始化属性源Environment 准备
2obtainFreshBeanFactory()创建/刷新 BeanFactory,解析 BeanDefinition读取 XML/注解配置
3prepareBeanFactory()设置 ClassLoader、SpEL 解析器、注册环境 Bean添加 ApplicationContextAwareProcessor
4postProcessBeanFactory()空方法,留给子类扩展Web 容器在此添加 Web 相关组件
5invokeBeanFactoryPostProcessors()执行 BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor配置类解析、@ComponentScan 在此执行
6registerBeanPostProcessors()注册所有 BeanPostProcessor按优先级排序注册,AOP 处理器在此注册
7initMessageSource()初始化国际化消息源支持 i18n
8initApplicationEventMulticaster()初始化事件广播器(SimpleApplicationEventMulticaster事件机制基础设施
9onRefresh()模板方法,子类覆盖Spring Boot 在此启动内嵌 Web 服务器
10registerListeners()注册 ApplicationListener将监听器添加到广播器
11finishBeanFactoryInitialization()实例化所有非懒加载 singleton Bean最关键的步骤,Bean 生命周期全部在此
12finishRefresh()清理缓存、初始化 Lifecycle Bean、发布 ContextRefreshedEvent启动完成事件通知

2. 推断构造方法

java
@Service
public class UserService {
    
    private final UserDao userDao;
    private final EmailService emailService;
    
    // 唯一构造器 → 自动注入,无需 @Autowired
    public UserService(UserDao userDao, EmailService emailService) {
        this.userDao = userDao;
        this.emailService = emailService;
    }
}

从 Spring 4.3+ 开始,如果 Bean 只有一个构造方法,不再需要显式加 @Autowired

Knowledge4J — Java 知识库