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日
    浏览(25)
  • Spring Boot 应用程序生命周期扩展点妙用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(31)
  • spring boot项目生成容器并运行

    一个安静的周末, shigen 又睡懒觉了,上次说的拖延症的惩罚来了:早晚各100个健腹轮练习,早上的已经完成了。今天的文章来的有点晚,但是依旧保持质量。 将springboot项目打包成jar包,上传到服务器并打包成镜像,运行成 docker 容器对外提供服务。 这篇文档写于 2023年5月

    2024年02月10日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包