当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?