这是我试图实现的简化版本。我有多个相同接口的实现。根据运行时的用户输入,我想选择正确的实现。
例如,假设我有一个名为 Color 的接口。有很多类实现了这个接口,Red 类、Blue 类、Green 类等等。
在运行时,我需要根据用户输入选择实现。实现这一目标的一种方法是这样的
@Autowired
@Qualifier("Red")
private Color redColor;
@Autowired
@Qualifier("Green")
private Color greenColor;
private Color getColorImplementation()
{
if(userInput=="red")
{
return redColor;
}
else if(userInput=="green")
{
return greenColor;
}
else
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但问题在于,每次添加新实现时,我都必须更新选择实现的代码,这违背了 spring 控制反转部分的整个目的。使用 spring 执行此操作的正确方法是什么?
您可以自动装配相关接口的所有实现,然后根据接口提供的属性决定使用哪个。
@Autowired
private List<Color> colors;
public void doSomething(String input) {
colors.stream().filter(c -> c.getName().contains(input)).findFirst().ifPresent(c -> {
// something
}
}
Run Code Online (Sandbox Code Playgroud)
这也没有那么神奇,更符合 OO 原则。依赖注入是最初连接事物,而不是在运行时动态切换。
| 归档时间: |
|
| 查看次数: |
3472 次 |
| 最近记录: |