spring invokeBeanFactoryPostProcessors 执行流程执行流程分析

本文介绍了如何通过实现BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor来在Spring容器初始化时扫描并注册自定义注解。重点讲解了这两个接口的工作原理、执行流程以及如何利用它们对bean定义进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先自定义扩展一个BeanFactoryPostProcessor

1 定义一个MyBeanFactoryPostProcessor,实现BeanFactoryPostProcessor接口

2 在代码中添加:addBeanFactoryPostProcessor(new MyBeanFactoryPostProcessor())

或者直接在配置文件中定义

<bean id="myBean" class="com.lyh.MyBeanFactoryPostProcessor" ></bean>

3 测试类

4 结果:

下面来分析invokeBeanFactoryPostProcessors 的执行流程

首先要搞清楚两个关键的接口BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistry主要是对BeanDefinition的增加,修改,删除,查找等操作

总结的流程如下:

一般如果想将类注册到spring容器,让spring来完成实例化,常用方式如下:

xml中通过bean节点来配置;

使用@Service、@Controller、@Conponent等注解。

最近在研究通过Spring初始化时扫描自定义注解,查到了通过实现BeanDefinitionRegistryPostProcessor获取Bean,从而获得自定义注解。

Spring支持我们通过代码来将指定的类注册到spring容器中。

Spring容器初始化时,从资源中读取到bean的相关定义后,保存在BeanDefinitionMap,在实例化bean的操作就是依据这些bean的定义来做的,而在实例化之前,Spring允许我们通过自定义扩展来改变bean的定义,定义一旦变了,后面的实例也就变了,而beanFactory后置处理器,即BeanFactoryPostProcessor就是用来改变bean定义的。

通过invokeBeanFactoryPostProcessors方法用来找出所有beanFactory后置处理器,并且调用这些处理器来改变bean的定义。

BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,BeanFactoryPostProcessor的实现类在其postProcessBeanFactory方法被调用时,可以对bean的定义进行控制,因此BeanDefinitionRegistryPostProcessor的实现类一共要实现以下两个方法:

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException

该方法的实现中,主要用来对bean定义做一些改变。

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException

该方法用来注册更多的bean到spring容器中,详细观察入参BeanDefinitionRegistry接口,看看这个参数能带给我们什么能力。

从BeanDefinitionRegistry可以看到,BeanDefinitionRegistry提供了丰富的方法来操作BeanDefinition,判断、注册、移除等方法都准备好了,我们在编写postProcessBeanDefinitionRegistry方法的内容时,就能直接使用入参registry的这些方法来完成判断和注册、移除等操作。

org.springframework.context.support.AbstractApplicationContext#refresh中的invokeBeanFactoryPostProcessors(beanFactory);用来找出所有beanFactory后置处理器,并且调用这些处理器来改变bean的定义。

invokeBeanFactoryPostProcessors(beanFactory)实际上是委托org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());方法处理的。

先处理外部集合BeanFactoryPostProcessor

处理BeanDefinitionRegistryPostProcessor,先处理实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor

再处理实现了Ordered接口的BeanDefinitionRegistryPostProcessor

最后处理没有实现任何接口的BeanDefinitionRegistryPostProcessor

再处理执行BeanFactoryPostProcessor的postProcessBeanFactory方法

// 如果beanFactory不归属于BeanDefinitionRegistry类型,那么直接执行postProcessBeanFactory方法

下面开始处理容器中 所有的BeanFactoryPostProcessor的postProcessBeanFactory方法了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值