2016-12-13 128 views
0

我有一些Spring @Components和@Qualifier注解,我们假设它在示例“A”和“B”中。我想将它们(仅使用注释)注入List。我怎样才能做到这一点 ?弹簧自动装配合格豆的集合

@Component 
public class WhatIHave { 

    @Autowired 
    @Qualifier("A") 
    private MyType firstBean; 

    @Autowired 
    @Qualifier("B") 
    private MyType secondBean; 
    .... 
} 

@Component 
public class WhatIWantToHave { 

    @Autowired 
    @Qualifier("A", "B") //something like that 
    private List<MyType> beans; 
    ... 
} 

我是否需要在@Configuration类中创建它?

@Configuration 
public class MyConfiguration { 

    @Autowired 
    @Qualifier("A") 
    private MyType firstBean; 

    @Autowired 
    @Qualifier("B") 
    private MyType secondBean; 

    @Bean 
    public List<MyType> beans() { 
     return Lists.newArrayList(firstBean, secondBean); 
    } 
} 

还有另一种方法可以做到这一点吗?

+1

只需从'@ Autowired'列表中删除'@ Qualifier'。 – Kayaman

+0

我知道@Qualifier(“A”,“B”)是不正确的语法,但它只是一个想法,而不是我提供的配置类。 – Ferdezo

+0

找到这个[答案](http://stackoverflow.com/questions/36262825/binding-annotation-in-spring/36277309#36277309) – marok

回答

0

@Qualifier是知道哪个bean是有资格自动连接上一个字段中同类型豆的情况下,为什么不:

@Autowired 
@Qualifier("A") 
private MyType firstBean; 

@Autowired 
@Qualifier("B") 
private MyType secondBean; 

则:

List<MyType> list = new ArrayList<>(); 
list.add(firstBean); 
list.add(secondBean); 
+0

这使得一份工作,但不是很好的解决方案,因为需要添加新的字段类。在我看来,向@Configuration类添加新字段更好。但是我想知道这种仅基于注释的解决方案。 – Ferdezo

0

这个怎么解决办法

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.beans.BeansException; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.stereotype.Component; 
@Component 
public class TypeCollector implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 

     this.applicationContext = applicationContext; 
    } 

    public <T> List<T> getBeans(Class<T> clazz, String... names) { 
     List<T> list = new ArrayList<>(); 
     for (String name : names) { 
      list.add(applicationContext.getBean(name, clazz)); 
     } 
     return list; 
    } 
} 

您可以自动装入TypeCollector并询问bean的运行时间。缺点是在运行时会得到NoSuchBeanDefinitionException,并且必须使用bean名称而不是限定符。

+0

在我看来,比@Configuration类更多的代码 – Ferdezo