spiring系列-看源码AbstractApplicationContext.refresh()->finishBeanFactoryInitialization()

前言:

  Spring Bean生命周期:

  实例化-new一个对象

  注入属性-为实例化中new出来的对象填充属性

  初始化-执行aware接口的方法,执行@PostContructor注解的方法,初始化方法,完成AOP代理

  销毁

1、finishBeanFactoryInitialization()

  源码注解:Instatiate all remaining (non-lazy-init) singletons

  实例化所有非懒加载的单例bean

2、调用链路

  1)AbstractApplicationContext

    1.1)516行 ->refresh()

    1.2)550行 ->finishBeanFactoryInitialization()

    1.3)878行 ->beanFactory.preInstatiateSingletons()//真正开始实例化入口

  上述的beanFactory实际使用的DefaultListableBeanFactory

  2)DefaultListableBeanFactory

    2.1)846行 ->preInstatiateSingletons()

    2.2)860/874/879行 ->getBean()//继承父类AbstractBeanFactory

  3)AbstractBeanFactory

    3.1)242行 ->doGetBean()// 真正获取bean的方法

    3.2)249行 ->getSingleton()//继承父类DefaultSingletonBeanRegistry

      如果获一级缓存有直接返回,没有判断二级缓存有直接返回,

      没有判断三级缓存有将其放入二级缓存,并清除三级缓存

    3.3)321行 ->getSingleton()// 如果249行返回空,执行lamda表达式

                createBean()//继承父类AbstractAutowireCapableBeanFactory

  4)AbstractAutowireCapableBeanFactory

    4.1)517行 ->doCreateBean()// 真正创建bean的方法

    4.2)557行 ->createBeanInstance()// 完成bean实例创建

    4.3)588行 ->addSingletonFactory()// 将bean对象的工厂放入三级缓存

    4.4)594行 ->populateBean()// 注入属性

    4.5)595行 ->initializeBean()// 初始化

  5)DefaultSingletonBeanRegistry 

    5.1)228行 ->this.singletonObjects.get()

    5.2)248行 ->addSingleton()// 将初始化好的对象加入一级缓存

 3、如果有AOP代理

  上面4.3步骤有对AOP做处理

  1)AbstractAutowireCapableBeanFactory

    588行 ->addSingletonFactory()

    588行 ->getEarlyBeanRefence()// 获取工厂

    961行 ->hasInstantiationAwareBeanPostProcessors// 如果要处理

    965行 ->ibp.getEarlyBeanRefence()// 此处如果有AOP,

        其对应的Processor为AnnotationAwareAspectJAutoProyCreator

  2)AbstractAutoProxyCreator

    240行 ->wrapIfNecessary()// 如果需要代理返回代理对象,否则直接返回原对象

4、为什么使用三级缓存

  如果只有两级缓存的话,也就是说在对象完成初始化之后注入属性之前就需要完成对象

  的代理,这样循环依赖的对象在从二级缓存获取到的对象才会是代理对象。这违背了Spring

  设计的AOP代理是在对象初始化的最后阶段才去完成的原则。而使用三级缓存则在只有在

  对象需要提前代理的情况下会将代理对象的工厂放入三级缓存(循环依赖),否则三级缓存

  里存的是对象的工厂,在初始化的最后一步再进行代理。

spiring系列-看源码AbstractApplicationContext.refresh()->finishBeanFactoryInitialization()

上一篇:合天网安实验室:了解你的系统


下一篇:elasticsearch集群