Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析

这篇具有很好参考价值的文章主要介绍了Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析,Spring boot 核心源码浅析系列,spring boot,微服务,spring,java,后端

0. 前言

之所以在企业级应用中Spring 到Spring Boot 一直立于不败之地,保持火热,其中很关键的一个点是,它的扩展简直太强大了,上一篇,我们聊了一下 Spring Boot整个生命周期中的扩展点,,比如SpringApplicationRunListener可以监听应用的各个阶段。本文我们聊聊,Spring 容器上的扩展。可用于自定义和扩展 Spring 容器的行为。其中,三个常见的容器扩展接口是 BeanFactoryPostProcessorBeanPostProcessorBeanDefinitionRegistryPostProcessor。通过实现这些接口,开发者可以自定义 Spring 容器的行为,从而更好地满足应用程序的需求。

下面我们分别聊聊这三种的Spring 容器相关的扩展接口加载时机,原理,以及使用方式。帮助大家更好地理解 Spring Boot 中的容器扩展。

  • BeanFactoryPostProcessor 接口可以在 Spring 容器实例化 Bean 对象之前修改 Bean 的配置元数据。
  • BeanPostProcessor 接口可以在 Spring 容器实例化 Bean 对象之后对 Bean 进行一些自定义操作。
  • BeanDefinitionRegistryPostProcessor 接口可以在 Spring 容器实例化 Bean 对象之前修改 Bean 的配置元数据,并向容器中添加新的 Bean 定义。
    Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析,Spring boot 核心源码浅析系列,spring boot,微服务,spring,java,后端

冰点出品,必属精品


1. 容器扩展接口

Spring的可扩展性非常强大,其中的一个重要原因就是它提供了许多的PostProcessor,开发人员可以通过这些接口来对Spring容器中的Bean进行自定义的处理和增强。
其中,BeanFactoryPostProcessor 接口对应着 BeanFactory,它主要用于处理 BeanDefinition,也就是 Bean 的定义信息,包括 Bean 的类型、作用域、依赖关系等等。BeanFactoryPostProcessor 在 Bean 实例化之前执行,它可以修改 BeanDefinition 的配置信息,从而影响 Bean 的实例化过程。
与之不同的是,BeanPostProcessor 接口主要用于对 Bean 实例进行处理和增强。它在 Bean 实例化之后执行,可以对 Bean 进行各种自定义操作,例如添加代理、修改属性值等等。
如下图
Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析,Spring boot 核心源码浅析系列,spring boot,微服务,spring,java,后端

此图来自网络

2. 使用场景示例

1. BeanFactoryPostProcessor

BeanFactoryPostProcessor 是 Spring 容器提供的一个扩展接口,用于在 Spring 容器实例化 Bean 对象之前修改 Bean 的配置元数据。在 Spring 容器初始化的过程中,当容器读取完 Bean 定义信息后,就会调用 BeanFactoryPostProcessor 接口的实现类的 postProcessBeanFactory() 方法。在该方法中,开发者可以通过 BeanDefinitionRegistry 来获取和修改 Bean 的配置元数据。

BeanFactoryPostProcessor 接口定义了一个方法 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),其中 ConfigurableListableBeanFactory 是一个 Bean 工厂的配置接口,定义了对 Bean 工厂的一些配置方法。通过实现该接口,开发者可以获取到 Bean 工厂的配置信息,并对 Bean 工厂中的 Bean 进行修改。

下面是一个示例,该示例在 Bean 实例化之前将所有 Bean 定义的 scope 属性设置为 prototype

public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);
            beanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);
        }
    }
}

在该示例中,我们实现了 BeanFactoryPostProcessor 接口,并在 postProcessBeanFactory() 方法中获取了 Bean 工厂的所有 Bean 定义,然后将它们的 scope 属性设置为 prototype,从而将它们的作用域修改为原型作用域。

2. BeanPostProcessor

BeanPostProcessor 是 Spring 容器提供的另一个扩展接口,用于在 Spring 容器实例化 Bean 对象之后对 Bean 进行一些自定义操作。在 Spring 容器初始化的过程中,当容器实例化一个 Bean 对象后,就会调用 BeanPostProcessor 接口的实现类的 postProcessBeforeInitialization() 方法和 postProcessAfterInitialization() 方法。在这两个方法中,开发者可以对 Bean 对象进行一些自定义操作。

BeanPostProcessor 接口定义了两个方法:

/**
* 用于在 Bean 初始化之前对其进行处理。具体来说,该方法将在任何 Bean 的初始化回调方法(例如 InitializingBean 的 
* afterPropertiesSet 方法或自定义的 init 方法)之前调用。在此之前,Bean 已经被实例化并填充了属性值。
* 该方法允许对 Bean 进行自定义处理,例如添加代理、修改属性值等等。该方法的返回值是一个 Bean 实例,
* 可以是原始的 Bean 实例或者是一个代理实例,如果返回 null,则表示不对该 Bean 进行处理。
*/
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
/**
* 该方法将在任何 Bean 的初始化回调方法(例如 InitializingBean 的 afterPropertiesSet 方法或自定义的
*  init 方法)之后调用。在此之后,Bean 已经被完全初始化,可以进行各种操作。
* 该方法允许对 Bean 进行自定义处理,例如添加代理、修改属性值等等。
* 该方法的返回值是一个 Bean 实例,可以是原始的 Bean 实例或者是一个代理实例
*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

下面是项目中的一个真实实例,强制性的给所有引入此组件的工程都注入一个默认属性。

/**
 * MybatisPlusProperties创建时添加默认配置
 */
public class ExtendFieldTypeHandlerPostProcessor implements BeanPostProcessor {
    /**
     * bean初始化前,动态添加配置
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        //判断当前初始化bean是MybatisPlusProperties
        if (bean instanceof MybatisPlusProperties) {
            MybatisPlusProperties mybatisPlusProperties = (MybatisPlusProperties) bean;
            mybatisPlusProperties.setTypeHandlersPackage("com.xxx.common.typeHandler");
            return mybatisPlusProperties;
        }
        return bean;
    }
}

}

3. BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor 是 Spring 容器提供的另一个扩展接口,用于在 Spring 容器实例化 Bean 对象之前修改 Bean 的配置元数据。与 BeanFactoryPostProcessor 不同的是,BeanDefinitionRegistryPostProcessor 可以向 Spring 容器中添加新的 Bean 定义。

在 Spring 容器初始化的过程中,当容器读取完 Bean 定义信息后,就会调用 BeanDefinitionRegistryPostProcessor 接口的实现类的 postProcessBeanDefinitionRegistry() 方法。在该方法中,开发者可以通过 BeanDefinitionRegistry 接口来获取和修改 Bean 的配置元数据,并向容器中添加新的 Bean 定义。

BeanDefinitionRegistryPostProcessor 接口定义了一个方法 postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry),其中 BeanDefinitionRegistry 是一个 Bean 定义注册的接口,定义了向容器中注册 Bean 定义的方法。通过实现该接口,开发者可以获取到 Bean 定义注册器的信息,并向容器中添加新的 Bean 定义。

下面是一个示例,该示例在 Bean 实例化之前向容器中添加一个新的 Bean 定义:

public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(CustomBean.class)
                .addPropertyValue("name", "Custom Bean")
                .getBeanDefinition();
        registry.registerBeanDefinition("customBean", beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}

实现了 BeanDefinitionRegistryPostProcessor 接口,并在 postProcessBeanDefinitionRegistry() 方法中向容器中添加了一个名为 customBean 的新的 Bean 定义。

3. 参考文档

  1. Spring Boot官方文档:https://spring.io/projects/spring-boot
  2. Spring Boot Reference Guide:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
  3. Spring Boot官方文档相关 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-customizing-bean-definitions
  4. Spring Boot 自动配置 https://docs.spring.io/spring-boot/docs/3.1.2/reference/html/auto-configuration-classes.html#appendix.auto-configuration-classes

Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析,Spring boot 核心源码浅析系列,spring boot,微服务,spring,java,后端文章来源地址https://www.toymoban.com/news/detail-676995.html

到了这里,关于Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring容器扩展点在微服务中的使用

    BeanFactoryPostProcessor BeanDefinitionRegistryPostProcessor bean注册后置处理器 BeanPostProcessor InstantiationAwareBeanPostProcessor AbstractAutoProxyCreator @Import ImportBeanDefinitionRegistrar ImportSelector Aware ApplicationContextAware BeanFactoryAware InitializingBean || @PostConstruct FactoryBean mybatis feign 实现 SmartInitializingSingleton

    2024年02月13日
    浏览(35)
  • Spring Boot 应用程序生命周期扩展点妙用

    上一篇我们着重按照分类讲解了一下Spring Boot的常见扩展点,接下来我们讲解一下Spring Boot 的应用程序生命周期扩展点的一些妙用。 Spring Boot的应用程序生命周期扩展点是一些接口,可以让开发者在应用程序的不同生命周期阶段插入自己的逻辑。这些扩展点可以帮助开发者在

    2024年02月15日
    浏览(59)
  • Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析

       BeanFactoryPostProcessor 位于 org.springframework.beans.factory.config 包中。它与 BeanPostProcessor 有相似的核心逻辑,但它们之间的主要区别在于它们所操作的对象。 BeanFactoryPostProcessor 的主要目的是对 Bean 的配置元数据进行操作,这意味着它可以影响 Bean 的初始配置数据。   在 Sp

    2024年02月11日
    浏览(39)
  • 【Spring】BeanPostProcessor后置处理器

    BeanPostProcessor后置处理器是Spring提供的一个扩展点,可以在Bean初始化前后做一些事情,注意这里是bean的初始化,不是实例化,BeanPostProcessor是一个接口,里面提供了两个方法,分别为postProcessBeforeInitialization(初始化之前)和postProcessAfterInitialization(初始化之后),在方法入参

    2024年02月08日
    浏览(50)
  • 深入了解 Spring BeanPostProcessor 的应用

    Spring框架的强大之处在于其提供了丰富的扩展点,其中之一是BeanPostProcessor接口。这个接口允许我们在Spring容器实例化bean之后、在调用初始化方法之前和之后对bean进行一些自定义的处理。在这篇文章中,我们将深入研究BeanPostProcessor的使用场景,并通过一个详细的例子演示如

    2024年01月25日
    浏览(37)
  • 扩展点都不知道不要说你用了Spring Boot

    哈哈,本次有点标题党的嫌疑了,话又说回来,如果只停留在Spring Boot的基本的CRUD层面,未免也太过局限了,当需要去扩展一些功能,写一些组件的时候,就感觉无从下手了,所以本次,我们从一个标题党开始,了解一下Spring Boot 的扩展点,可以系统的了解记忆一下, 此文不

    2024年02月15日
    浏览(75)
  • “深入理解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入理解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简单且高效的方式来创建独立的、生产级别的应用程序。本文将深入探讨Spring Boot的核心概念和特性,并通过示例代码展示如何使用Spring Boot构建

    2024年02月15日
    浏览(62)
  • “深入了解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入了解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一款快速构建Java应用程序的开发框架,它基于Spring框架,提供了一系列的自动化配置和约定,使得开发者能够更快速、更高效地构建出高质量的应用程序。本文将深入探讨Spring Boot的核心特性和使用

    2024年02月14日
    浏览(57)
  • Spring Boot 配置 Undertow 容器

    配置之前,您需要知道的是,Tomcat, Jetty, Undertow 作为三大主流 Servelt 容器,Undertow 的性能要优于前两者。 所以,我们推荐您使用 Undertow 容器。接下来,就我们看看如何在 Spring Boot 中快捷地集成 Undertow。 添加完上面的 maven 依赖后,Undertow 容器就已经集成完毕了,接下来,让

    2024年02月08日
    浏览(40)
  • Spring Boot 如何使用 Web 容器

    在使用 Spring Boot 进行开发时,我们通常需要使用 Web 容器来处理 HTTP 请求和响应。本文将介绍 Spring Boot 如何使用 Web 容器,包括如何配置 Web 容器、如何处理 HTTP 请求和响应等内容,并提供相应的代码示例。 Spring Boot 中默认使用 Tomcat 作为 Web 容器,但是也支持其他的 Web 容器

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包