分享
👇载ke程:97java.xyz/4494/
Spring Bean生命周期与循环依赖的源码级深度解析
一、Bean生命周期的底层架构
Spring框架通过三级缓存机制和扩展点设计,构建起完整的Bean生命周期管理体系。其核心架构由三个关键缓存池和多个扩展接口组成:
三级缓存体系:
SingletonObjects:存储完整初始化的单例Bean,采用ConcurrentHashMap实现线程安全
EarlySingletonObjects:缓存已实例化但未完成属性注入的早期对象,解决循环依赖的关键中间态
SingletonFactories:存储ObjectFactory对象,通过工厂模式延迟创建Bean,支持AOP代理的提前暴露
扩展点矩阵:
InstantiationAwareBeanPostProcessor:实例化阶段前置处理
BeanPostProcessor:初始化阶段前后处理
SmartInitializingSingleton:单例初始化完成后的回调
DisposableBean:销毁阶段处理
二、生命周期核心流程解析
1. 注册阶段
BeanDefinition的注册过程通过BeanDefinitionRegistry接口实现,支持XML配置、注解扫描和编程式注册三种方式。在合并BeanDefinition时,Spring采用继承机制处理父子Bean关系,子Bean会继承父Bean的scope、lazy-init等属性,但会覆盖同名属性。
2. 实例化阶段
实例化过程通过AbstractAutowireCapableBeanFactory的createBeanInstance方法实现,包含三种策略:
构造器推断:通过SmartInstantiationAwareBeanPostProcessor确定最优构造器
实例化策略:采用SimpleInstantiationStrategy进行普通实例化,或CglibSubclassingInstantiationStrategy实现CGLIB代理
提前暴露机制:在populateBean前将ObjectFactory存入三级缓存,为循环依赖提供解决方案
3. 属性填充阶段
属性注入通过AutowiredAnnotationBeanPostProcessor实现,其工作流程:
解析@Autowired/@Value注解
通过DependencyDescriptor描述依赖关系
调用DefaultListableBeanFactory的resolveDependency方法
递归触发依赖Bean的创建流程
4. 初始化阶段
初始化包含三个关键步骤:
Aware接口回调:依次调用BeanNameAware、BeanFactoryAware、ApplicationContextAware等接口
BeanPostProcessor前置处理:如AutowiredAnnotationBeanPostProcessor的postProcessAfterInitialization
初始化方法调用:执行@PostConstruct注解方法或InitializingBean的afterPropertiesSet方法
5. 销毁阶段
销毁过程通过DisposableBeanAdapter实现,包含:
预销毁通知:调用DestructionAwareBeanPostProcessor的requiresDestruction方法
销毁方法调用:执行@PreDestroy注解方法或DisposableBean的destroy方法
资源释放:关闭DataSource、NetworkConnection等资源
三、循环依赖的破局之道
1. 循环依赖场景分类
构造器循环依赖:无法解决,Spring会直接抛出BeanCurrentlyInCreationException
Setter循环依赖:通过三级缓存机制解决
多级循环依赖:如A→B→C→A,同样可解决
2. 三级缓存协作机制
以A→B→A的典型场景为例:
A的创建:
实例化A对象并存入三级缓存
开始属性填充时发现依赖B
B的创建:
实例化B对象并存入三级缓存
属性填充时发现依赖A,从三级缓存获取A的ObjectFactory
通过getObject()方法获取A的早期引用,并存入二级缓存
完成B的初始化后存入一级缓存
A的完成:
从一级缓存获取完整的B对象
完成A的属性填充和初始化
将A从二级缓存升级到一级缓存
3. AOP代理的特殊处理
当Bean需要AOP代理时,ObjectFactory的实现类AbstractAutoProxyCreator会:
在getObject()方法中创建代理对象
将代理对象存入二级缓存
确保后续获取的都是代理对象而非原始对象
四、设计哲学与演进方向
Spring通过三级缓存机制实现了:
空间换时间:用三级缓存结构避免重复创建对象
延迟加载:通过ObjectFactory延迟代理对象的创建
线程安全:采用ConcurrentHashMap和同步块保证并发安全
在Spring 5.x版本中,框架进一步优化了循环依赖处理:
增强了对函数式Bean注册的支持
改进了循环依赖的检测机制
优化了内存占用,二级缓存采用弱引用实现
这种设计模式为分布式系统中的依赖管理提供了重要启示,其核心思想——通过分级缓存和延迟计算解决循环依赖,已被广泛应用于微服务架构的依赖治理领域。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信65 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传