spring源码之BeanPostProcessor

BeanPostProcessor 也是 ioc 容器中非常重要的部分。

BeanPostProcessor 的作用

前面的文章中经常提到 BeanPostProcessor,它是用来拦截所有 bean 的初始化的,在 bean 的初始化之前,和初始化之后做一些事情。这点从 BeanPostProcessor 接口的定义也可以看出来,它里面就两个方法:postProcessBeforeInitialization 和 postProcessAfterInitialization。

BeanPostProcessor 实例化流程

很显然,BeanPostProcessor 也是由 ioc 容器管理的,那么他们对应的 bean,是在哪里实例化的呢?答案是 refresh() 方法中的 registerBeanPostProcessors 方法。

可以看到,这个过程在 beanDefinition 的解析之后,普通 bean 的实例化与初始化之前。

因为 BeanPostProcessor 的 beanDefinition,也是在 invokeBeanFactoryPostProcessors 方法中解析出来然后放到 beanDefinitionMap 中的。然后既然要对一般的 bean 的初始化进行拦截,那势必在那之前,BeanPostProcessor 首先就要实例化并初始化完成!

首先看个实例来证明 registerBeanPostProcessors 方法调用结束后,所有 BeanPostProcessor 的 bean 被实例化了。

在执行该方法之前,spring 的一级缓存 singletonObjects 中只有21个 bean。这个一级缓存以前说过,专门存放 spring 初始化完成的 bean。getBean 的时候首先就从这里面取。 

然后,registerBeanPostProcessors 方法执行完毕后,singletonObjects 里就有30个 bean 了,其中就包含之前讲内置 tomcat 时提到的 webServerFactoryCustomizerBeanPostProcessor。

然后进到 registerBeanPostProcessors 方法中看看是如何实现的。

首先是根据 BeanPostProcessor.class 类型,在 beanDefinitionNames 中一个个匹配,找出是 BeanPostProcessor 类型的 bean的 beanName,这里找出了7个。beanDefinitionNames 是在加载 bean 定义信息时设置的,来源是 @ComponentScan、@Bean、@Import 等。

上面的 webServerFactoryCustomizerBeanPostProcessor 就是在ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar 的 registerBeanDefinitions 方法中登记的。在 springboot 自动装配时,会将它对应的 BeanDefinition 加载到容器中。

然后,对查询到的这些 BeanPostProcessor 做了下分类,再逐步进行实例化,实际上就是调用 getBean 方法。

当 BeanPostProcessor 全部初始化完成后,就可以在之后的普通 bean 初始化前后发挥作用了。

BeanPostProcessor 如何工作

BeanPostProcessor 是在 bean 的初始化方法 initializeBean 中起作用的。

在此方法中,会先获取所有 BeanPostProcessor,然后挨个调用他们的 postProcessBeforeInitialization 方法。然后调用初始化方法。最后再次获取所有 BeanPostProcessor,然后挨个调用他们的 postProcessAfterInitialization 方法。

BeanPostProcessor 在 spring ioc 中是一个非常重要的组件,懂得了它的工作原理,就方便了自定义 BeanPostProcessor。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值