在Spring中如何处理两个同名的bean?

时间:2018-12-28 09:12:24

标签: java spring

我有三个jar和一个warABCD(war)AB取决于CD取决于AB
X中有一个接口C
Y中有X的实现类AYX的实现类B bean中的Spring名。

喜欢这个:

package com.example.a
class Y implements X

package com.example.b
class Y implements X

我的问题:

D中,我想使用Spring同时获得两个beans。怎么做?

在“ C”中:

package com.example.c
public interface X {
    String getPath();
}

在“ A”中:

package com.example.a
@Component
public class Y implements X {
    public String getPath(){
        return "/User/name/application";
    }
}

在“ B”中:

package com.example.b
@Component
public class Y implements X {
    public String getPath(){
        return "/usr/local/bin";
    }
}

在“ D”中:

package com.example.d
public class Application{
    @Autowired
    private List<? extends X> xes;
    public static void main(String[] args){
        for(X x : xes){
            System.out.println(x.getPath());
        }
    }
}

AB具有完全相同的Y名称时,您会怎么做?

2 个答案:

答案 0 :(得分:3)

尽管两个bean的类型(接口)都相同,但是您可以给它们两个不同的名称:

@Bean
public X beanYInPackageA(){
   return new com.example.a.Y();
}

@Bean
public X beanYInPackageB(){
   return new com.example.b.Y();
}

并使用@Qualifier通过@Autowired顶部的bean名称(按名称进行连接)进一步定义注入哪些bean:

@Autowired
@Qualifier("beanYInPackageA")
private X beanYInPackageA;

@Autowired
@Qualifier("beanYInPackageB")
private X beanYInPackageB;

答案 1 :(得分:0)

由于您要自动装配给定接口的所有实现的列表,因此spring为它提供了以下代码:

@Autowired
private List<X> list;

您可以遍历注入的列表。

有关完整示例,您可以通过enter image description here链接。