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

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值