具有多个接口实现的 Spring Autowire Bean,在方法中定义实现

Posted

技术标签:

【中文标题】具有多个接口实现的 Spring Autowire Bean,在方法中定义实现【英文标题】:Spring Autowire Bean with multiple Interface Implementations, define Implementation in method 【发布时间】:2016-03-03 22:54:30 【问题描述】:

我是弹簧和弹簧靴的新手,所以希望这不是一个愚蠢的问题。

我有一个包含多个实现的接口。实现用@Component("NameOfImpl")注解。

我的目标是用选定的实现自动装配 bean。在正常情况下,我可以使用@Autowired @Qualifier("NameOfImpl") 来完成,但我的问题是我想以如下方法选择一个实现:

public void doSomethingMethod() 
      for(String line: configFile)
                String[] values = line.split(";");

                if (values[0].equals("A")) 
                    //here I want to select an bean implementation

                
                else if (values[0].equals("B")) 
                    //here I want to select another bean implementation

                
      
      bean.doSomething();
    

我怎样才能做到这一点?你有什么建议? 谢谢!

【问题讨论】:

您可以删除自动装配,因为您正在手动实例化实现 我的目标不是手动实例化它们 使用new 表示实例化.. 是的,我知道,我需要一些东西而不是使用 new Impl();我编辑帖子 看看这个方法***.com/questions/15284851/… 【参考方案1】:

你可以让 Spring 注入一个 Map 的 bean。映射中的键将是 bean 的名称。

如果你有一个名为Example的接口

public interface Example 


还有两个实现:

@Component("foo")
public class FooExample implements Example 



@Component("bar")
public class BarExample implements Example 


你可以有一张Example bean 注入的地图:

@Component
public class ExampleConsumer 

    private final Map<String, Example> examples;

    @Autowired
    public ExampleConsumer(Map<String, Example> examples) 
        this.examples = examples;
    

在这种情况下,地图将包含两个条目:

"foo" -> FooExample 实例 "bar" -> BarExample 实例

【讨论】:

【参考方案2】:

这也有效

public interface Example 



@Component("foo")
public class FooExample implements Example 



@Component("bar")
public class BarExample implements Example 


您可以简单地自动连接它们

@Component
public class ExampleConsumer 

 @Autowired
    private final Map<String, Example> examples;



"foo" -> FooExample 实例 "bar" -> BarExample 实例

【讨论】:

以上是关于具有多个接口实现的 Spring Autowire Bean,在方法中定义实现的主要内容,如果未能解决你的问题,请参考以下文章

Spring Autowire

Spring笔记03(创建对象,DI设值注入,自动装配(autowire))

Spring9AutoWire(自动装配)机制

@Autowire和@Resource注解的区别

Autowire(自动装配)机制

(005)spring注解@Resource和@Autowire的区别