目录
[一、什么是 Spring 的装配顺序?](#一、什么是 Spring 的装配顺序?)
[二、Spring 容器整体启动 & 装配顺序(先有全局)](#二、Spring 容器整体启动 & 装配顺序(先有全局))
[1. 启动 Spring 容器](#1. 启动 Spring 容器)
[2. 加载配置源](#2. 加载配置源)
[3. 扫描组件(@ComponentScan)](#3. 扫描组件(@ComponentScan))
[4. 注册 BeanDefinition(非常关键)](#4. 注册 BeanDefinition(非常关键))
[5. 处理配置类(@Configuration)](#5. 处理配置类(@Configuration))
[6. 实例化 Bean(Instantiation)](#6. 实例化 Bean(Instantiation))
[7. 依赖注入(DI)](#7. 依赖注入(DI))
[8. 初始化 Bean(Initialization)](#8. 初始化 Bean(Initialization))
[9. AOP 代理生成(BeanPostProcessor)](#9. AOP 代理生成(BeanPostProcessor))
[10. 容器就绪(Ready)](#10. 容器就绪(Ready))
[四、装配顺序 vs Bean 生命周期(重点区分)](#四、装配顺序 vs Bean 生命周期(重点区分))
[五、Spring Boot 中的装配顺序](#五、Spring Boot 中的装配顺序)
在 Spring 中,"装配(Wiring)"指的是 Spring 如何发现 Bean、创建 Bean、并完成依赖注入的过程 。
理解装配顺序,有助于我们搞清楚 为什么某些 Bean 注入失败、AOP 为什么生效、配置类为什么能生效。
一、什么是 Spring 的装配顺序?
Spring 装配顺序 = Spring 容器启动并准备可用 Bean 的整体流程
- 装配关注的是"Bean 如何被放进容器并建立关系"
- 生命周期关注的是"单个 Bean 从生到死"
二、Spring 容器整体启动 & 装配顺序(先有全局)
启动容器
↓
加载配置(XML / JavaConfig / 自动配置)
↓
扫描 Bean(@ComponentScan)
↓
注册 BeanDefinition
↓
处理配置类(@Configuration)
↓
实例化 Bean
↓
依赖注入(DI)
↓
初始化 Bean
↓
AOP 代理生成
↓
容器就绪
这是"装配顺序"的核心主线
三、详细装配流程解析
1. 启动 Spring 容器
java
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
容器启动是装配的起点。
2. 加载配置源
Spring 支持多种配置方式:
- XML(applicationContext.xml)
- JavaConfig(@Configuration)
- Spring Boot 自动配置
配置加载顺序早于 Bean 创建
3. 扫描组件(@ComponentScan)
java
@ComponentScan("com.example")
Spring 会扫描指定包,识别:
- @Component
- @Service
- @Repository
- @Controller
- @Configuration
此时只"登记",不创建对象
4. 注册 BeanDefinition(非常关键)
Spring 会为每个 Bean 创建一个 BeanDefinition:
BeanDefinition = Bean 的"设计图纸"
包含:
- Bean 的类型
- 作用域(singleton / prototype)
- 是否懒加载
- 依赖关系
装配的本质就是操作 BeanDefinition
5. 处理配置类(@Configuration)
java
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
Spring 会:
- 解析 @Bean
- 通过 CGLIB 增强配置类
- 保证 @Bean 方法返回单例
这是 JavaConfig 能生效的核心
6. 实例化 Bean(Instantiation)
Spring 根据 BeanDefinition 创建对象:
- 构造器
- 工厂方法
- FactoryBean
此时对象已存在,但依赖未注入
7. 依赖注入(DI)
Spring 进行依赖装配:
- @Autowired
- @Qualifier
- @Resource
- 构造器注入
此阶段才是真正的"装配"
8. 初始化 Bean(Initialization)
执行:
- @PostConstruct
- InitializingBean
- init-method
Bean 进入可用状态
9. AOP 代理生成(BeanPostProcessor)
- 执行 postProcessAfterInitialization
- 生成代理对象
- 替换原始 Bean
事务、日志、权限在此生效
10. 容器就绪(Ready)
- 所有单例 Bean 创建完成
- 容器可以对外提供服务
四、装配顺序 vs Bean 生命周期(重点区分)
| 对比项 | 装配顺序 | 生命周期 |
|---|---|---|
| 关注点 | 容器整体流程 | 单个 Bean |
| 粒度 | 全局 | 局部 |
| 是否包含扫描 | 是 | 否 |
| 是否包含 AOP | 是 | 是 |
五、Spring Boot 中的装配顺序
Spring Boot 在上述基础上多了:
读取 spring.factories
↓
自动配置类加载
↓
条件装配(@Conditional)
自动装配 ≠ 自动注入
六、总结
Spring 的装配顺序是:
启动容器 → 加载配置 → 扫描组件 → 注册 BeanDefinition → 实例化 Bean → 依赖注入 → 初始化 → AOP 代理 → 容器就绪。
Spring 装配顺序的本质,是容器围绕 BeanDefinition 展开的一次"建模 → 实例 → 代理"的过程。