Spring源码分析-深刻理解生命周期之BeanFactoryProcessor

生命周期之BeanFactoryPostProcessor

先来看看bean的生命周期。对于熟悉spring 的朋友来讲,bean的生命周期并不陌生。它能够在bean加载,bean初始化的过程当中加入咱们本身的逻辑。而且这样体现了spring开放式的设计。先来看看生命周期的图:spring

今天咱们要介绍的是生命周期中的BeanFactoryPostProcessor,那这个接口的做用是啥呢?它能够对已经加载好的BeanDefinition进行处理。Spring IOC 允许BeanFactoryPostProcessor 在容器实际实例化任何bean以前读取配置的元数据。有过Spring使用经验的人对 ${property} 这样的表达式确定很熟悉。它就是对配置信息进行替换。这样使得配置解耦出来。而具体的逻辑就是在BeanFactoryPostProcessor相关的实现类的postProcessBeanFactory方法中实现的。post

具体实现逻辑本文不介绍。能够看看BeanFactoryPostProcessor接口的几个实现类(好比PropertyPlaceholderConfigurer)。设计

今天咱们抛出一个疑问:既然BeanFactoryPostProcessor是在Bean加载完毕后,Bean初始化完毕前起做用的。那咱们若是在xml配置文件中自定义一个BeanFactoryPostProcessor实现类,按照道理来讲这个实现类都没有初始化,是怎么起做用的?cdn

先抛出答案:这个是特殊的bean,它在其余普通bean以前实例化前真的被实例化了。而且若是咱们使用BeanFactory而不是用ApplicationContext,那么配置的BeanFactoryPostProcessor实现类不会生效,而且BeanPostProcessor也不会生效。xml

分析:blog

缘由在于AbstractApplicationContext的 refresh方法中:接口

这个invokeBeanFactoryPostProcessors 恰好对BeanFactoryPostProcessor实现类进行了实例化,而且进行激活调用。生命周期

进去看看:get

能够发现,源码中有不少getBean方法,这个正是实例化BeanFactoryPostProcessor的方法。源码

而且invokeBeanFactoryPostProcessors方法正是对invokeBeanFactoryPostProcessor实现类进行了激活,并对BeanDefinition进行了更改。

能够看到这个for循环里对BeanFactoryPostProcessor实现类进行了调用。

总结:本文开头的图只是ApplicationContext对应的生命周期,并非BeanFactory对应的bean的生命周期。由于我在BeanFactory实现中没有找到BeanFactoryPostProcessor相应的实现逻辑。题外话,并且对于BeanPostProcessor来讲spring容器启动只是注册实例化了BeanPostProcessor并无调用,而是容器启动的末尾,对其余bean 进行getBean时,才会调用到这些BeanPostProcessor

心得:之前对Bean生命周期只是死记硬背,如今时豁然开朗。不须要死记硬背的,后面将会介绍bean生命周期其余的过程。

相关文章
相关标签/搜索