使用自动装配的不同事物创建多个 Bean 实例

Posted

技术标签:

【中文标题】使用自动装配的不同事物创建多个 Bean 实例【英文标题】:Creating multiple Bean instances with different things autowired in 【发布时间】:2021-02-01 02:01:32 【问题描述】:

我正在尝试获取 Spring Boot 依赖注入以允许我执行以下操作:

interface MyBean

@Component
class MyBeanA : MyBean

@Component
class MyBeanB : MyBean

@Component
class MyBeanConsumer(myBean: MyBean)

这里,Spring 抱怨有多个 MyBean 类型的 bean。我希望它创建两个MyBeanConsumer 实例。一个是MyBeanA,一个是MyBeanB。我需要对许多 bean 执行此操作,因此我试图避免像这样的样板配置类:

@Configuration
class MyBeanConfiguration 
    @Bean
    fun consumers(myBeans: List<MyBean>) = myBeans.map  MyBeanConsumer(it) 

这可能在春季吗?

【问题讨论】:

那么您将拥有多个MyBeanConsumer 实例。你想如何使用它们。我的意思是在您的程序中的某个地方,您想使用其中一个,而在某个地方使用另一个?或者你想遍历它们并做一些事情。 是的,拥有多个实例是计划。我想将它们用作列表。 【参考方案1】:

您可以使用Qualifier 注释并指定请求的bean 的名称。

你可以访问这个 Spring @Autowired and @Qualifier

【讨论】:

这没有回答问题。我不想要一个具有限定参数的实例。我希望每个可能的参数都有一个实例。【参考方案2】:

如果您想在程序中的任何地方将它们作为 bean 列表注入,您可以采用这种方法。

@Configuration public MyConfigurationClass 
        
        @Bean
        @Qualifier("mylist")
        public List<MyType> configure() 
            //create your dynamical list here
        
 

但是,如果您想在程序中的某个地方将它们用作单个 bean,并且还想将它们全部作为 List 注入到其他地方,您可以这样做:

@Configuration
public class AppConfig implements BeanFactoryPostProcessor 
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException 
        for (int i = 0; i < 3; i++) 
            System.out.println("register my bean: " + i);
            beanFactory.registerSingleton("bean-" + i, new MyBean("MyBean-" + i));
        
    

阅读以下答案以获取更多详细信息: How to create multiple beans of same type according to configuration in Spring?

【讨论】:

这正是我想要避免的:每种情况的样板。我在问题中说明了这一点。

以上是关于使用自动装配的不同事物创建多个 Bean 实例的主要内容,如果未能解决你的问题,请参考以下文章

自动装配[@Autowired]的歧义性

在 Jackson StdDeserializer 的自定义实例中自动装配 Bean

2018-03-30 装配bean之自动化装配

Spring之Bean的自动装配

Spring--自动装配

创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段