【spring源码 4.3.7】Spring IoC源码学习:registerBeanPostProcessors() 详解


相关文章:
Spring源码系列之容器启动流程 建议先阅读这篇文章

系列文章:
【spring源码】01.Spring源码整体脉络介绍及源码编译–spring笔记
【spring源码】02.Ioc容器加载过程-Bean的生命周期源码深度剖析–spring笔记
【spring源码】Spring IoC源码学习:invokeBeanFactoryPostProcessors 详解
【spring源码 4.3.7】Spring IoC源码学习:registerBeanPostProcessors() 详解
【spring源码 4.3.7】Spring IoC源码学习:finishBeanFactoryInitialization() 详解
【spring源码 4.3.7】Spring IoC源码学习:BeanFactory.getBean() 详解
【spring源码 4.3.7】Spring IoC源码学习:AbstractAutowireCapableBeanFactory.populateBean()
【spring源码 4.3.7】Spring IoC源码学习:AbstractAutowireCapableBeanFactory.initializeBean() 初始化生命周期

前言

《Spring IoC源码学习:invokeBeanFactoryPostProcessors 详解》解析 中我们介绍了 invokeBeanFactoryPostProcessors 方法,而本文将介绍另一个类似的方法——registerBeanPostProcessors。

* * * 强烈建议先阅读《Spring IoC源码学习:invokeBeanFactoryPostProcessors 详解》中的前言部分,BeanPostProcessor处理器链的加载过程就是本篇文章的目的

invokeBeanFactoryPostProcessors 方法主要用于处理 BeanFactoryPostProcessor 接口,而 registerBeanPostProcessors 方法主要用于处理 BeanPostProcessor 接口。

BeanFactoryPostProcessor 和 BeanPostProcessor,相信大家很容易从命名看出来这两个接口“长得很像”。BeanFactoryPostProcessor 是针对 BeanFactory 的扩展,主要用在 bean 实例化之前,读取 bean 的定义,并可以修改它。BeanPostProcessor 是针对 bean 的扩展,主要用在 bean 实例化之后,执行初始化方法前后,允许开发者对 bean 实例进行修改。

概述

本方法会注册所有的 BeanPostProcessor,将所有实现了 BeanPostProcessor 接口的类加载到 BeanFactory 中。

BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IoC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。在 registerBeanPostProcessors 方法只是注册到 BeanFactory 中,具体调用是在 bean 初始化的时候。

具体的:在所有 bean 实例化时,执行初始化方法前会调用所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法,在执行初始化方法后会调用所有 BeanPostProcessor 的 postProcessAfterInitialization 方法。

本篇文章负责注册,那么何时调用这些接口呢?在执行初始化方法后会调用,详情参见 《Spring IoC源码学习:AbstractAutowireCapableBeanFactory.initializeBean()》

正文

首先我们回到 AbstractApplicationContext.refresh() 方法,找到代码:registerBeanPostProcessors(beanFactory),单击该行代码跳转到具体的实现。

内容比较简单,可以去看原文

整体流程图:
在这里插入图片描述

总结

如同 invokeBeanFactoryPostProcessors 方法一样,registerBeanPostProcessors 方法的内容也比较少,核心过程在代码块1的注释已经写清楚,这边稍微总结一下。

1.整个 registerBeanPostProcessors() 方法围绕 BeanPostProcessor 接口展开,和 invokeBeanFactoryPostProcessors() 不同的是:

  • invokeBeanFactoryPostProcessors ()方法会直接调用 BeanFactoryPostProcessor 接口定义的方法
  • 而 registerBeanPostProcessors() 方法只是将 BeanPostProcessor 实现类注册到 BeanFactory 的 beanPostProcessors 缓存中,并不执行接口中定义的方法。这是因为,此时还未到 BeanPostProcessor 实现类“出场的时候”。

试想为什么BeanFactoryPostProcessor 接口的子类直接调用方法,而BeanPostProcessor只是注册呢?因为前者是负责管理bean定义的,那么@ComponentScan(basePackages = {“com.test.spring”})下的类被扫描出来后,那么bean定义也基本确定了,因此可以直接处理;后者是bean的实例化后初始化的过程才会触发调用逻辑!

2.BeanPostProcessor 实现类具体的 “出场时机” 在创建 bean 实例时,执行初始化方法前后。postProcessBeforeInitialization 方法在执行初始化方法前被调用,postProcessAfterInitialization 方法在执行初始化方法后被调用。

参见 《Spring IoC源码学习:AbstractAutowireCapableBeanFactory.initializeBean()》,该文章介绍了bean的生命周期

3.BeanPostProcessor 实现类和 BeanFactoryPostProcessor 实现类一样,也可以通过实现 PriorityOrdered、Ordered 接口来调整自己的优先级。

4.registerBeanPostProcessors 方法和 invokeBeanFactoryPostProcessors 也会触发 bean 实例的创建,创建 Bean 实例是 IoC 的核心内容,之后会单独解析,目前暂不深入解析。

参考:
《Spring IoC源码学习:registerBeanPostProcessors 详解》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值