面试题记录:spring boot 启动流程 + 如何处理循环依赖
大致流程:
1.初始化spring boot
推断应用类型
加载初始化器与监听器
2.准备环境
创建 configurableEnvironment 加载系统属性,配置文件,命令行参数
3.创建上下文
根据应用类型创建对应的上下文
4.刷新上下文
调用refresh()方法完成Bean工厂初始化、执行BeanFactoryPostProcessor、注册BeanPostProcessor,并触发自动装配(通过@EnableAutoConfiguration加载spring.factories中的配置类)
4.启动内置服务器,发布 ApplicationStartedEvent 事件
5.调用Runner和CommandLineRunner 执行自定义逻辑
spring 循环依赖情况:
1.构造器注入
无法解决
2.Setter注入,字段注入
Spring通过将实例化后的对象提前暴露给Spring容器中的singletonFactories,解决了循环依赖的问题。
它的大致过程:
首先A对象实例化,然后对属性进行注入,发现依赖B对象
B对象此时还没创建出来,所以转头去实例化B对象
B对象实例化之后,发现需要依赖A对象,那A对象已经实例化了,所以B对象最终能完成创建
B对象返回到A对象的属性注入的方法上,A对象最终完成创建
Tips:
1.Spring是通过递归的方式获取目标bean及其所依赖的bean的;
2.Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。
from: https://cloud.tencent.com/developer/article/2348249