bean的生命周期
Spring中bean的生命周期,指的是单例bean创建到销毁的过程。
1. bean的和生命周期图
Spring 整个创建bean的过程,扩展点多,大致为以下这个样子。
bean的循环依赖问题
2.什么是循环依赖?
由上图可知,是先注入A?还是先注入B?所以这样就形成了循环依赖。
3.什么情况下的循环依赖可以解决?
依赖注入,在Spring中分为两种,一种是构造注入,一种是set注入。如果都是构造注入的话是没有办法解决的,看下表格。
依赖注入方式 | 循环依赖是否被解决 |
---|---|
均采用setter方法注入 | 是 |
均采用构造器注入 | 否 |
A中注入B的方式为setter方法,B中注入A的方式为构造器 | 是 |
B中注入A的方式为setter方法,A中注入B的方式为构造器 | 否 |
4.Spring 是如何解决循环依赖的?
要分为两种,一种是简单的循环依赖,一种是结合AOP的循环依赖。
Spring采用了三级缓存+set集合+AOP代理集合。
- 三级缓存
- singletonObjects :一级缓存,单例池。存储的是所有创建好的单例bean。
- earlySingletonObjects:二级缓存,完成实例化,但是还未进行属性注入及初始化的对象。不完整的bean,早期暴露的bean。
- singletonFactories : 提前暴露的一个单例工厂,二级缓存中存储的就是从这个工厂中获取到对象。
- set 集合
- singletonsCurrentlyInCreation:放正在创建的bean,用于判断是否产生循环依赖。bean在创建的时候,就会放入。
- AOP提交代理集合
- earlyProxyReferences: 是否已经提前进行AOP【条件:Bean有循环依赖+需要AOP时】,否则进行正常的AOP逻辑
调用AOP的方法 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary