spring 中是如何解决循环依赖的问题?

82 阅读1分钟

先了解一下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有什么作用?