Spring IOC 容器加载过程详解
IOC(Inversion of Control,控制反转)是 Spring 框架的核心,其加载过程是 Spring 应用启动的关键阶段。以下是 Spring IOC 容器的完整加载过程:
1. 资源定位阶段
容器首先需要找到需要加载的配置信息:
- 配置来源:
- XML 配置文件(如
applicationContext.xml
) - Java 注解(
@Configuration
类) - Java Config 类
- XML 配置文件(如
- 资源定位方式:
ClassPathResource
:类路径下的资源FileSystemResource
:文件系统中的资源UrlResource
:网络资源ServletContextResource
:Web 应用中的资源
2. BeanDefinition 的载入和解析
将配置信息转换为容器内部数据结构:
- 解析过程:
- XML 配置:使用
BeanDefinitionReader
读取并解析 - 注解配置:使用
AnnotatedBeanDefinitionReader
处理
- XML 配置:使用
- 生成 BeanDefinition:
- 每个
<bean>
或@Bean
都会转换为一个BeanDefinition
对象 - 包含类名、作用域、懒加载、初始化方法等信息
- 每个
3. BeanDefinition 的注册
将解析得到的 BeanDefinition 注册到容器中:
- 注册中心:
DefaultListableBeanFactory
的beanDefinitionMap
- 注册过程:
beanFactory.registerBeanDefinition(beanName, beanDefinition);
- 别名处理:同时注册 bean 的别名
4. Bean 的实例化阶段
当容器启动或第一次请求 bean 时进行实例化:
- 实例化策略:
- 默认使用 Java 反射(
Constructor.newInstance()
) - 可通过
InstantiationStrategy
自定义
- 默认使用 Java 反射(
- 依赖注入:
- 属性注入(setter 注入)
- 构造器注入
- 方法注入
5. 初始化阶段
完成实例化后的处理:
- 属性填充:
populateBean()
方法 - Aware 接口回调:
BeanNameAware
BeanFactoryAware
ApplicationContextAware
- BeanPostProcessor 前置处理:
postProcessBeforeInitialization()
- 初始化方法调用:
InitializingBean
的afterPropertiesSet()
- 自定义的
init-method
- BeanPostProcessor 后置处理:
postProcessAfterInitialization()
6. 使用阶段
- 通过
getBean()
方法获取并使用 bean - 单例 bean 会被缓存,重复调用返回同一实例
7. 销毁阶段
容器关闭时:
- DestructionAwareBeanPostProcessor 处理
- DisposableBean 的
destroy()
方法调用 - 自定义的
destroy-method
执行
关键时序图
扩展点
Spring 提供了多个扩展点供开发者干预 IOC 过程:
- BeanFactoryPostProcessor:干预 BeanDefinition
- BeanPostProcessor:干预 bean 实例化过程
- FactoryBean:自定义复杂对象的创建逻辑
- Aware 接口:获取容器基础设施
理解 IOC 加载过程对于掌握 Spring 框架的运行机制和解决复杂问题至关重要。每个阶段都提供了相应的扩展点,使得 Spring 框架具有极高的灵活性。