首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当找到多个匹配的bean时,Spring如何按名称自动布线?

当找到多个匹配的bean时,Spring如何按名称自动布线?
EN

Stack Overflow用户
提问于 2010-12-15 16:04:32
回答 3查看 170.3K关注 0票数 118

假设我有这样的接口:

代码语言:javascript
复制
interface Country {}
class USA implements Country {}
class UK implements Country ()

下面是配置xml的这段代码:

代码语言:javascript
复制
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>

我如何控制下面哪个依赖项是自动连接的?我想要英国的那个。

代码语言:javascript
复制
class Main {
    private Country country;
    @Autowired
    public void setCountry(Country country) {
        this.country = country;
    }
}

我使用的是Spring3.0.3.RELEASE。

EN

回答 3

Stack Overflow用户

发布于 2010-12-15 16:13:04

您可以使用@限定符注释

来自here

使用限定符微调基于注释的自动装配

由于按类型自动装配可能会导致多个候选对象,因此通常有必要对选择过程进行更多控制。实现这一点的一种方法是使用Spring的@Qualifier注释。这允许将限定符值与特定参数相关联,缩小类型匹配集,以便为每个参数选择特定的bean。在最简单的情况下,这可以是一个简单的描述性值:

代码语言:javascript
复制
class Main {
    private Country country;
    @Autowired
    @Qualifier("country")
    public void setCountry(Country country) {
        this.country = country;
    }
}

这将使用UK,将一个id添加到USA bean中,如果您想使用USA,则使用该bean。

票数 76
EN

Stack Overflow用户

发布于 2014-08-13 05:24:52

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

代码语言:javascript
复制
public class Main {
     private Country country;

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

在本例中,"#{country}字符串是一个Spring Expression Language (SpEL)表达式,它的计算结果是名为country的bean。

票数 12
EN

Stack Overflow用户

发布于 2016-09-07 20:53:14

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

代码语言:javascript
复制
@Primary
class USA implements Country {}

这样,它将被选为默认的自动挂载候选,而不需要在其他bean上自动挂载。

对于mo,请查看Autowiring two beans implementing same interface - how to set default bean to autowire?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4447877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档