一、前言
在 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);
}
}