当find多个匹配的bean时,Spring如何通过名称自动装载?

假设我有这样的接口:

interface Country {} class USA implements Country {} class UK implements Country () 

和这个configurationxml的片段:

 <bean class="USA"/> <bean id="country" class="UK"/> <bean id="main" class="Main"/> 

我如何控制下面哪个依赖项是自动assembly的? 我想要一个英国人。

 class Main { private Country country; @Autowired public void setCountry(Country country) { this.country = country; } } 

我正在使用Spring 3.0.3.RELEASE。

这在Spring 3.0手册的3.9.3节中有logging:

对于回退匹配,bean名称被视为默认限定符值。

换句话说,默认行为就好像你已经给setter方法添加了@Qualifier("country")

您可以使用@Qualifier批注

从这里

使用限定符对基于注释的自动assembly进行微调

由于按types自动assembly可能导致多个候选人,所以通常有必要对select过程有更多的控制。 一种方法是使用Spring的@Qualifier注解。 这允许将限定符值与特定参数相关联,从而缩小匹配types的集合,从而为每个参数select特定的bean。 在最简单的情况下,这可以是一个简单的描述性价值:

 class Main { private Country country; @Autowired @Qualifier("country") public void setCountry(Country country) { this.country = country; } } 

这将使用英国添加一个ID到美国豆,并使用,如果你想美国。

实现相同结果的另一种方法是使用@Value注释:

 public class Main { private Country country; @Autowired public void setCountry(@Value("#{country}") Country country) { this.country = country; } } 

在这种情况下, "#{country}string是一个Springexpression式语言(SpEL)expression式,其值为一个名为country的bean。

还有一个解决名称的解决scheme:

 @Resource(name="country") 

它使用javax.annotation包,所以它不是Spring特定的,但Spring支持它。

在某些情况下,您可以使用注释@Primary。

 @Primary class USA implements Country {} 

这样它将被选为默认的自动注册候选者,而不需要另一个bean上的autowire-candidate。

对于mo deatils来看看Autowiring 两个实现相同接口的bean – 如何将默认的bean设置为autowire?