先了解一下spring bean的生命周期:
1、元信息的配置阶段
2、元信息的解析
3、spring bean的注册
4、BeanDefinition的合并
5、spring bean class的加载
RootBeanDefinition---》Class
6-1、实例化前
InstantiationAwareBeanPostProcessor
6-2、实例化
a、默认的无参构造器实例化,CGLIB实现
b、构造器注入
6-3、实例化后
7、属性赋值
8、Aware接口回调阶段
9-1、初始化前
9-2、初始化
9-3、初始化后
9-4、初始化完成
10-1、销毁前
10-2、销毁
11、spring bean GC
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);---一级缓存
private final Map<String, Object> earlySingletonObjects = new HashMap(16);---二级缓存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);---三级缓存
spring解决循环依赖在6-2实例化和7属性赋值之间;
该bean是单例并且正在创建中,将该bean的引用放入到三级缓存
在初始化后,先从一级缓存取,没有到二级缓存,再到三级缓存,获取到后,从三级缓存删除,放到二级缓存中。 为什么解决不了构造器注入的循环依赖?因为实例化需要用到构造器注入的方式,所以没法解决。
续:提几个问题?
1、BeanFactoryPostProcessor有什么作用?
2、BeanDefinitionRegistryPostProcessor有什么作用?
3、PriorityOrdered有什么作用?
4、Ordered有什么作用?