生命周期之BeanFactoryPostProcessor

先来看看bean的生命周期。对于熟悉spring 的朋友来说,bean的生命周期并不陌生。它可以在bean加载,bean初始化的过程中加入我们自己的逻辑。并且这样体现了spring开放式的设计。先来看看生命周期的图:

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

具体实现逻辑本文不介绍。可以看看BeanFactoryPostProcessor接口的几个实现类(比如PropertyPlaceholderConfigurer)。

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

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

分析:

原因在于AbstractApplicationContext的 refresh方法中:

这个invokeBeanFactoryPostProcessors 刚好对BeanFactoryPostProcessor实现类进行了实例化,并且进行激活调用。

进去看看:

可以发现,源码中有很多getBean方法,这个正是实例化BeanFactoryPostProcessor的方法。

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

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

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

心得:以前对Bean生命周期只是死记硬背,现在时豁然开朗。不需要死记硬背的,后面将会介绍bean生命周期其他的过程。

Spring源码分析-深入理解生命周期之BeanFactoryProcessor相关推荐

  1. Spring源码分析——Bean的生命周期

    文章目录 说明 测试代码 说明 本文从源码的角度分析Spring中Bean的加载过程,本文使用的Spring版本为4.3.25.RELEASE 测试代码 测试代码如下,根据这段简单的测试代码,一步步跟 ...

  2. zuul源码分析之Request生命周期管理

    为什么80%的码农都做不了架构师?>>>    zuul核心框架 zuul是可以认为是一种API-Gateway.zuul的核心是一系列的filters, 其作用可以类比Servle ...

  3. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)

    五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 ,  指定初始化方法 init-method 方法​ 二 ,指定销毁 ...

  4. Spring源码学习--Bean的生命周期

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  5. PHP源码分析-PHP的生命周期

    PHP的最多的两种运行模式是WEB模式.CLI模式. 无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行. 1.当我们在终端敲入php这个命令的时候,它使用的是CLI. 它就像一个web服务 ...

  6. 跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期)

    跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期) 简介 Bean 元信息来源 Bean 元信息解析成 BeanDefinition 并注册 BeanDefinition 转变成 ...

  7. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  8. spring源码分析第六天------spring经典面试问题

    spring源码分析第六天------spring经典面试问题 1.Spring5 新特性及应用举例 2.Spring 经典的面试问题 a.什么是 Spring 框架?Spring 框架有哪些主要模块 ...

  9. beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

最新文章

  1. httpclient工具类,post请求发送json字符串参数,中文乱码处理
  2. R语言检验类别型变量独立性
  3. mysql btmp 删除_mysql-如何在VDS上运行docker(lxd /容器)
  4. 盛大 牛人 blog
  5. python jupyter安装_python之jupyter的安装
  6. loadrunner通过使用libmysql.dll完成mysql的测试
  7. PHP的composer清除缓存
  8. centos7重新加载服务的命令_Centos7 常用防火墙操作命令
  9. EXE和SYS通信(ReadFile WriteFile DO_DIRECT_IO) 直接方式
  10. MongoDB常用操作总结
  11. 嵩天-Python语言程序设计程序题--第一周:Python基本语法元素
  12. Android junit单元测试
  13. gitlab版本控制系统源码部署
  14. GC overhead limit exceeded 的解决方案与详情分析
  15. 请问如何让路由器信号增强
  16. 你好,这是你要的五彩斑斓的黑
  17. 荣耀8怎样修改wifi服务器,手机怎么设置荣耀路由器wifi密码?
  18. 三运放差分放大电路分析_三运放组成的差分放大器电路图及特点
  19. 求子集PHP,JavaScript求非空子集数目的实现方法
  20. JS调用window系统通知

热门文章

  1. Centos7中yum安装jdk及配置环境变量
  2. linux程序设计百度网盘,linux系统编程视频 百度网盘下载
  3. 剑指offer反转链表(C++实现|测试用例|迭代法和递归法)
  4. 知己知彼 防范攻击:网络攻击步骤与黑客攻击原理
  5. Linux下V4L2捕捉画面+H264压缩视频+帧缓冲显示视频————H264压缩视频
  6. (转)Geth控制台使用及Web3.js使用实战
  7. BZOJ3091: 城市旅行
  8. iOS 远程通知(Remote Notification)和本地通知(Local Notification)
  9. C++——构造和析构函数
  10. c# 值类型数据与引用类型数据