一、Spring-IOC启动流程:
分为两种配置xml和注解:
- ClassPathXmlApplicationContext(通过xml解析)。
- AnnotationConfigApplicationContext(通过注解解析)。
初始化三个角色:
- BeanDefinationReader 读取器(会初始化很多后置处理器)
- BeanDefinationScanner 扫描器
- BeanDefinationRegister 注册器(把对象注册到容器中)
开始解析:
二、Spring如何解决循环依赖?
循环依赖概念:A依赖B、B依赖A。
Spring中使用三级缓存来解决循环依赖(三层concurrentHashMap)。
第一层:singletonObjects(用于存储成熟的Bean);
第二层:earlySingletonObjects(用于存储不成熟的Bean);
第三层:singletonFactories(用于存储函数接口,一个钩子方法,Aop就在此处可以实现);
set集合(singletonCurrentlyInCreation)用于存放正在创建的Bean的name。
例子:AB循环依赖。
首先getBean(A)、把A标记为正在创建,然后实例化、属性注入。属性注入发现依赖B、getBean(B)、把B标记为正在创建,然后实例化、属性注入、发现依赖A、从一级缓存中拿、从二级缓存中拿、最后从三级缓存中拿,先调用三级缓存中的函数接口、然后得到BeanA(如果是Aop的话,这里会返回一个动态代理的BeanA)、然后吧这个BeanA放入二级缓存。完成BeanB的创建。
BeanA(然后去二级缓存中拿)并且返回,完成BeanA的创建。