spring-BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor三者区别

本文详细介绍了Spring中BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor和BeanPostProcessor三个接口的执行顺序及其作用。BeanDefinitionRegistryPostProcessor用于添加额外的Bean定义,BeanFactoryPostProcessor则用于在Bean实例化前修改Bean定义,而BeanPostProcessor则在Bean实例化后执行,用于进一步处理Bean实例。在Spring启动过程中,这三个接口的执行顺序为:BeanDefinitionRegistryPostProcessor -> BeanFactoryPostProcessor -> BeanPostProcessor。在Bean实例化时,BeanPostProcessor的before和after初始化方法会在Bean构造方法和初始化方法之间调用。

一、三者的执行顺序

BeanDefinitionRegistryPostProcessor接口

唯一方法:BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry
作用:所有常规bd已经加载完毕,然后可以再添加一些额外的bd。
执行顺序:三个中最先执行的

比如下面几个都是Spring自己定义的,都是对BeanDefinitionRegistryPostProcessor接口的实现

  1. ConfigurationClassPostProcessor -----处理@Configuration注解

注意:BeanDefinitionRegistryPostProcessor接口继承了BeanFactoryPostProcessor接口。官网的建议是BeanDefinitionRegistryPostProcessor用来添加额外的bd。

BeanFactoryPostProcessor接口

唯一方法:BeanFactoryPostProcessor#postProcessBeanFactory
作用:Bean实例化之前执行,所有的bd已经全部加载完毕,然后可以对这些bd做一些属性的修改或者添加工作。
执行时间:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在Bean实例化之前执行

官网的建议是BeanDefinitionRegistryPostProcessor用来添加额外的bd,而BeanFactoryPostProcessor用来修改bd
Spring允许BeanFactoryPostProcessor在容器实例化任何其它Bean之前读取配置元数据,并可以根据需要进行修改

spring中,有内置的一些BeanFactoryPostProcessor实现类,常用的有:

  1. org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
  2. org.springframework.beans.factory.config.PropertyOverrideConfigurer
  3. org.springframework.beans.factory.config.CustomEditorConfigurer:用来注册自定义的属性编辑器

BeanPostProcessor

作用:针对Bean实例化之后做一些逻辑处理
执行顺序:spring容器加载了Bean的定义并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后

spring中,有内置的一些BeanPostProcessor实现类,例如:

  1. org.springframework.context.annotation.CommonAnnotationBeanPostProcessor:支持@Resource注解的注入
  2. org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor:支持@Required注解的注入
  3. org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor:支持@Autowired注解的注入
  4. org.springframework.orm.jpa.support.PersistenceAnnotatio
### BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor 的作用和区别Spring 框架中,`BeanDefinitionRegistryPostProcessor` 和 `BeanFactoryPostProcessor` 是两个用于自定义配置和修改容器行为的扩展点接口。它们主要用于在 Spring 容器加载和初始化 bean 定义的过程中进行干预。 #### BeanDefinitionRegistryPostProcessor `BeanDefinitionRegistryPostProcessor` 是 `BeanFactoryPostProcessor` 的子接口,它提供了一个额外的方法 `postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)`。这个方法允许在容器的标准 bean 定义注册完成后、但在任何 bean 实例化之前添加更多的 bean 定义[^3]。 ##### 示例代码: ```java public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 添加自定义的 bean 定义 GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClassName("com.example.MyBean"); registry.registerBeanDefinition("myBean", beanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 可以在这里对 bean 工厂进行进一步的处理 } } ``` #### BeanFactoryPostProcessor `BeanFactoryPostProcessor` 提供了 `postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)` 方法,该方法允许对已经加载的 bean 定义进行修改,但此时 bean 还未被实例化。通过此方法,可以修改 bean 的属性值或者替换 bean 的实现类[^2]。 ##### 示例代码: ```java public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 修改已有的 bean 定义 BeanDefinition beanDefinition = beanFactory.getBeanDefinition("existingBean"); beanDefinition.setBeanClassName("com.example.NewImplementation"); } } ``` #### 主要区别 1. **功能范围**: - `BeanDefinitionRegistryPostProcessor` 允许添加新的 bean 定义,并且可以在 `postProcessBeanDefinitionRegistry` 方法中执行这些操作。 - `BeanFactoryPostProcessor` 主要用于修改现有的 bean 定义,而不涉及新增 bean 定义。 2. **调用时机**: - `BeanDefinitionRegistryPostProcessor` 的 `postProcessBeanDefinitionRegistry` 方法在容器的标准 bean 定义注册完成后立即调用。 - `BeanFactoryPostProcessor` 的 `postProcessBeanFactory` 方法在所有的 bean 定义都被注册之后调用,但此时 bean 还未被实例化。 3. **继承关系**: - `BeanDefinitionRegistryPostProcessor` 继承自 `BeanFactoryPostProcessor`,因此它可以同时实现两种不同的处理逻辑。 通过理解和应用这两个接口,开发者可以在 Spring 容器启动的不同阶段插入自定义逻辑,从而灵活地控制 bean 的创建和配置过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值