一、Spring-IOC启动流程:
    分为两种配置xml和注解:

    1. ClassPathXmlApplicationContext(通过xml解析)。
    2. AnnotationConfigApplicationContext(通过注解解析)。

    初始化三个角色:

    1. BeanDefinationReader 读取器(会初始化很多后置处理器)
    2. BeanDefinationScanner 扫描器
    3. 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的创建。