前言:
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代理是在对象初始化的最后阶段才去完成的原则。而使用三级缓存则在只有在
对象需要提前代理的情况下会将代理对象的工厂放入三级缓存(循环依赖),否则三级缓存
里存的是对象的工厂,在初始化的最后一步再进行代理。