Spring源码讲解(五)Spring中的生命周期回调
由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦
当代码执行完populateBean之后,spring对bean的属性注入就完成了,这个时候的bean已经可以称作是一个真正的bean了,其生命周期已经基本走完了,之后就是执行他的生命周期回调。具体的方法是AbstractAutowireCapableBeanFactory#initializeBean:
point1:
invokeAwareMethods中会判断当前bean是否实现了以下接口:
BeanNameAware:实现了就注入当前bean的名称
BeanClassLoaderAware:实现了就注入当前bean的类加载器
BeanFactoryAware:实现了就注入spring的bean工厂
point2(第七次后置处理器BeanPostProcessor#postProcessBeforeInitialization方法):
这里会执行容器中所有BeanPostProcessor的postProcessBeforeInitialization方法,这个方法相信都不陌生吧,平时我们在须要bean初始化之前做些事也经常会重写这个方法。这里还有两个重点须要提的spring的默认的后置处理器:
ApplicationContextAwareProcessor
当执行其postProcessBeforeInitialization方法时,如果当前的bean实现了***Aware接口的话,就注入须要的对象进来:
只要实现特定的接口,spring会帮你注入一些对象:
CommonAnnotationBeanPostProcessor
这个后置处理器是不是很熟悉,之前是处理@Resource注解的属性注入的,在这里还有另外一个功能:
可以看到其无参构造方法上面标识了两个注解@PostConstruct和@PreDestroy。他继承了一个父类,这两个标识的方法都是这个父类所有的,InitDestroyAnnotationBeanPostProcessor(听名字就知道他是干什么用的了吧):
然后在执行postProcessBeforeInitialization方法时,会执行当前bean标注了@PostConstruct注解的方法:
首先通过findLifecycleMetadata方法找到LifecycleMetadata这个对象,这个对象里面包含了当前bean所有加了@PostConstruct注解的方法:
InitDestroyAnnotationBeanPostProcessor#findLifecycleMetadata方法 ->
InitDestroyAnnotationBeanPostProcessor#buildLifecycleMetadata方法
point3(InitializingBean生命周期回调):
invokeInitMethods方法中会判断当前bean是否实现了InitializingBean接口,实现了的话就执行其afterPropertiesSet方法:
point4(第八次后置处理器BeanPostProcessor#postProcessAfterInitialization方法):
执行所有BeanPostProcessor的postProcessAfterInitialization方法,另外之前说的AOP生成代理对象也是在这里完成的。(AnnotationAwareAspectJAutoProxyCreator,之前说过)
最终走完八个后置处理器之后,Spring的bean就真正生成了,回到DefaultListableBeanFactory#preInstantiateSingletons方法,当Spring将所有bean都生成出来之后,会在最后触发最后一个生命周期回调接口SmartInitializingSingleton:
这个回调就比前几个相对特殊些,因为不是每个bean一实例化出来之后就回调了,而是当Spring初始化完所有bean之后,统一再一个个回调。
所以bean的生命周期回调是在bean属性注入之后才执行的,主要有四个点,根据先后顺序为:
1.BeanPostProcessor#postProcessBeforeInitialization
(**Aware接口的对象注入-ApplicationContextAwareProcessor;以及@PostConstruct方法的回调-CommonAnnotationBeanPostProcessor)
2.InitializingBean#afterPropertiesSet
3.BeanPostProcessor#postProcessAfterInitialization
(AOP生成代理对象-AnnotationAwareAspectJAutoProxyCreator)
4.SmartInitializingSingleton#afterSingletonsInstantiated