具有多个接口实现的 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,在方法中定义实现的主要内容,如果未能解决你的问题,请参考以下文章