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