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#refreshAbstractApplicationContext#finishBeanFactoryInitializationConfigurableListableBeanFactory#preInstantiateSingletonsAbstractBeanFactory#getBeanAbstractBeanFactory#doGetBeanDefaultSingletonBeanRegistry#getSingletonAbstractAutowireCapableBeanFactory#createBeanAbstractAutowireCapableBeanFactory#doCreateBeanAbstractAutowireCapableBeanFactory#createBeanInstanceDefaultSingletonBeanRegistry#addSingletonFactoryAbstractAutowireCapableBeanFactory#populateBeanAbstractAutowireCapableBeanFactory#initializeBean
总结:
- Spring 使用
BeanDefinition管理 Bean 的元数据。 - Bean 实例化和属性注入分开进行。
- 生命周期中提供了多种扩展点,如
BeanFactoryPostProcessor、Aware 接口、BeanPostProcessor和初始化方法。 - 三级缓存解决循环依赖问题,通过
ObjectFactory处理代理对象。