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

文章目录

前言

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

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),单击该行代码跳转到具体的实现。

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

扫描二维码关注公众号,回复: 12917862 查看本文章

总结

如同 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 详解》

猜你喜欢

转载自blog.csdn.net/m0_45406092/article/details/114983516
今日推荐