ApplicationContext 的初始化过程?初始化过程中发现循环依赖 Spring 是如何处理的?
时间: 2024-05-21 20:12:25 浏览: 96
ApplicationContext的初始化过程主要包括以下几个步骤:
1. 加载配置文件并解析
2. 创建和初始化BeanDefinition对象
3. 实例化非懒加载的单例Bean
4. 注入依赖关系或者依赖查找
在初始化过程中,如果发现有循环依赖,Spring 会采用三级缓存解决循环依赖。具体做法是:
1. 创建第一个 bean A,将其包装成 ObjectFactory 放入 一级缓存 中。
2. 创建第二个 bean B,此时会发现需要依赖第一个 bean A。Spring 会尝试从二级缓存中查找 bean A,如果找到,则将其返回。如果没有找到,继续创建 bean A,并将其放入 二级缓存 中。
3. 创建第一个 bean A 完成后,返回其实例并注入给 bean B,然后将其包装成 ObjectFactory 放入 一级缓存 中。
4. 同时,将 bean B 放入 二级缓存 中。
5. 完成 bean B 的创建,将其返回。
6. 当第三个 bean C 创建时,发现需要依赖 bean A 和 bean B,此时同样会采用二级缓存来解决循环依赖。
通过这样的方式,Spring 可以在初始化 bean 的过程中避免出现循环依赖导致的死循环或者空指针等问题。
阅读全文