Spring 框架加载及 Bean 生命周期流程

配置加载 → Bean定义注册 → BeanFactoryPostProcessor增强

实例化 → 三级缓存 → 属性填充 → Aware接口回调

初始化前处理 → @PostConstruct → afterPropertiesSet → init-method → 初始化后处理(AOP代理)

一级缓存 → 业务使用 → 容器关闭 → @PreDestroy → destroy()

一、配置加载与 Bean 定义注册

​资源定位与解析

Spring 通过 ResourceLoader 加载配置文件(XML、YAML 或注解配置)。
使用 BeanDefinitionReader(如 XmlBeanDefinitionReader 或 AnnotatedBeanDefinitionReader)解析配置,生成 ​BeanDefinition 对象。

​BeanDefinition 注册

将 BeanDefinition 注册到 BeanDefinitionRegistry(如 DefaultListableBeanFactory 的 beanDefinitionMap)。

​BeanFactory 增强

调用 BeanFactoryPostProcessor 实现类(如 PropertySourcesPlaceholderConfigurer),修改 BeanDefinition 的属性值(如占位符替换)。

二、Bean 实例化与初始化

实例化阶段

触发时机:

调用 BeanFactory.getBean() 时,进入 AbstractAutowireCapableBeanFactory.doCreateBean()。
​实例化方式:通过反射(默认)、工厂方法或构造器生成对象。

​三级缓存机制:

实例化后,将 ObjectFactory(Lambda 表达式)存入 ​三级缓存​(singletonFactories)。
若存在循环依赖,通过 getEarlyBeanReference() 提前生成代理对象,存入 ​二级缓存​(earlySingletonObjects)。

​属性填充与依赖注入:

populateBean():通过反射或 Setter 方法注入属性值,若依赖其他 Bean,递归调用 getBean()。

循环依赖解决:

通过三级缓存暴露早期引用,避免无限递归。

实例化BeanA
存入三级缓存
填充BeanA属性时发现依赖BeanB
实例化BeanB
BeanB填充属性时从三级缓存获取BeanA的ObjectFactory
生成BeanA代理对象存入二级缓存
BeanB完成初始化存入一级缓存
BeanA继续初始化
​初始化阶段

​Aware 接口回调:

调用 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等接口方法。

@PostConstruct → 2. InitializingBean.afterPropertiesSet() → 3. init-method

​初始化前处理:

执行 BeanPostProcessor.postProcessBeforeInitialization()(如 @PostConstruct 注解方法)。

​初始化方法调用:

执行 InitializingBean.afterPropertiesSet() 或自定义 init-method。

初始化后处理:

执行 BeanPostProcessor.postProcessAfterInitialization()(如生成 AOP 代理对象)。

​缓存升级:

将最终 Bean(代理对象或原始对象)存入 ​一级缓存​(singletonObjects),删除二、三级缓存。

​三、Bean 使用与销毁

​使用阶段:
通过 ApplicationContext.getBean() 获取完全初始化的 Bean,供业务逻辑调用。
​销毁阶段:
​ 容器关闭触发:调用 ApplicationContext.close() 或注册 JVM 关闭钩子。
​销毁方法执行:
调用 @PreDestroy 注解方法 → DisposableBean.destroy() → 自定义 destroy-method。
​作用域差异:
​Singleton:由 Spring 管理完整生命周期。
​Prototype:Spring 仅负责实例化,销毁由调用方处理。

​四、关键机制补充

​AOP 代理生成时机
​循环依赖时:在 getEarlyBeanReference() 中提前生成代理。
​初始化后:在 postProcessAfterInitialization() 中生成最终代理。
​缓存作用总结
​三级缓存:延迟生成早期引用,解决循环依赖。
​二级缓存:缓存已生成但未初始化的代理对象。
​一级缓存:存储完整的单例 Bean。

五、完整生命周期流程图

配置加载
BeanDefinition注册
BeanFactoryPostProcessor增强
实例化Bean
属性填充
初始化前处理
初始化方法
AOP代理生成
存入一级缓存
业务使用
销毁处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值