Spring Bean 生命周期与循环依赖详解
-
Java 对象与 Spring Bean 的区别:
- Java 对象的创建步骤:编译源码 -> 类加载到 JVM -> 初始化对象。
- Spring Bean 使用
BeanDefinition
描述对象信息,如@Scope
、@Lazy
等。
-
Spring Bean 生命周期:
- 扫描 Bean 信息:从 XML、注解或 JavaConfig 中读取。
- 封装 BeanDefinition :存储到
beanDefinitionMap
中。 - 执行 BeanFactoryPostProcessor :如
PropertyPlaceholderConfigurer
注入占位符信息。 - 实例化 Bean:通过反射选择构造器,实例化对象,但未注入属性。
- 属性注入 :解决依赖,如
UserService
依赖SendService
。 - 初始化工作 :
- 检查是否实现了 Aware 接口,如
ApplicationContextAware
获取ApplicationContext
。 - 执行 BeanPostProcessor,如 AOP 关键的
AnnotationAwareAspectJAutoProxyCreator
。 - 执行
@PostConstruct
、InitializingBean
、init-method
等初始化方法。
- 检查是否实现了 Aware 接口,如
- 销毁 Bean :执行
destroy-method
。
-
循环依赖解决方案:
-
三级缓存:
- 一级缓存 :
singletonObjects
,存储完全初始化的单例 Bean。 - 二级缓存 :
earlySingletonObjects
,存储未完全初始化的单例 Bean。 - 三级缓存 :
singletonFactories
,存储 Bean 工厂处理代理对象。
- 一级缓存 :
-
过程:
- 实例化 A:A 放入三级缓存。
- 注入 A 的属性:需要 B,实例化 B。
- 实例化 B:B 依赖 A,从三级缓存获取 A 的代理,将A代理对象放入二级缓存。
- 初始化 B:从二级缓存移至一级缓存。
- 返回 A:继续注入 A 的属性,完成初始化,移至一级缓存。
-
-
关键源码位置:
AbstractApplicationContext#refresh
AbstractApplicationContext#finishBeanFactoryInitialization
ConfigurableListableBeanFactory#preInstantiateSingletons
AbstractBeanFactory#getBean
AbstractBeanFactory#doGetBean
DefaultSingletonBeanRegistry#getSingleton
AbstractAutowireCapableBeanFactory#createBean
AbstractAutowireCapableBeanFactory#doCreateBean
AbstractAutowireCapableBeanFactory#createBeanInstance
DefaultSingletonBeanRegistry#addSingletonFactory
AbstractAutowireCapableBeanFactory#populateBean
AbstractAutowireCapableBeanFactory#initializeBean
总结:
- Spring 使用
BeanDefinition
管理 Bean 的元数据。 - Bean 实例化和属性注入分开进行。
- 生命周期中提供了多种扩展点,如
BeanFactoryPostProcessor
、Aware 接口、BeanPostProcessor
和初始化方法。 - 三级缓存解决循环依赖问题,通过
ObjectFactory
处理代理对象。