Spring:如何使用BeanFactoryPostProcessor创建多个Bean

一、前言

  在 Spring Boot 应用程序中,有时需要为同一个类创建多个实例(Bean),并且每个实例可能有不同的配置或用途。虽然可以通过在 @Configuration 配置类中定义多个 @Bean 方法来实现这一点,但在需要创建大量实例的情况下,这种方法不仅冗余,而且难以维护。

二、BeanFactoryPostProcessor 介绍

简介:
  BeanFactoryPostProcessor 是 Spring 框架中的一个高级接口,允许你在 Spring 容器实例化任何 bean 之前,对 Spring 容器中的 BeanFactory 进行自定义修改。这可以用于多种目的,包括添加、修改或删除 bean 定义。

主要功能

  修改BeanDefinition:例如,修改bean的属性值、更改bean的作用域等。

  注册新的BeanDefinition:动态地向Spring容器中添加新的bean定义。

  添加自定义元数据:向bean定义中添加自定义的元数据,以供后续的处理器使用。

三、代码示例

  通过 BeanFactoryPostProcessor 接口的自定义实现来创建同一类的多个 Bean 实例,步骤如下:

定义一个user对象

public class User {

    private String name;

    private int age;

    private String introduction;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getIntroduction() {
        return introduction;
    }

    public void setIntroduction(String introduction) {
        this.introduction = introduction;
    }

    public User(String name, int age, String introduction) {
        this.name = name;
        this.age = age;
        this.introduction = introduction;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", introduction='" + introduction + '\'' +
                '}';
    }
}

实现 BeanFactoryPostProcessor 接口
创建一个类实现 BeanFactoryPostProcessor 接口,并在其 postProcessBeanFactory 方法中添加多个 bean 定义。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;

public class CustomizeBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

        // 创建第一个 User 实例
        BeanDefinitionBuilder beanDefinitionBuilder1 = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        beanDefinitionBuilder1.addConstructorArgValue("张三");
        beanDefinitionBuilder1.addConstructorArgValue(18);
        beanDefinitionBuilder1.addConstructorArgValue("我爱好打篮球");
        registry.registerBeanDefinition("user1", beanDefinitionBuilder1.getBeanDefinition());

        // 创建第二个 User 实例
        BeanDefinitionBuilder beanDefinitionBuilder2 = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        beanDefinitionBuilder2.addConstructorArgValue("李四");
        beanDefinitionBuilder2.addConstructorArgValue(21);
        beanDefinitionBuilder2.addConstructorArgValue("我爱好健身");
        registry.registerBeanDefinition("user2", beanDefinitionBuilder2.getBeanDefinition());
    }
}

配置 Spring 容器
确保你的 Spring 配置文件或 Java 配置类能够检测到并应用你的 BeanFactoryPostProcessor 实现。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean
    public CustomizeBeanFactoryPostProcessor customizeBeanFactoryPostProcessor() {
        return new CustomizeBeanFactoryPostProcessor();
    }

}

测试结果

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);

        User user1 = (User) context.getBean("user1");
        User user2 = (User) context.getBean("user2");

        System.out.println(user1);
        System.out.println(user2);
    }

}

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奋斗的狍子007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值