基于运行时条件的 Spring switch 实现

dev*_*747 3 java spring

这是我试图实现的简化版本。我有多个相同接口的实现。根据运行时的用户输入,我想选择正确的实现。

例如,假设我有一个名为 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 执行此操作的正确方法是什么?

zap*_*apl 5

您可以自动装配相关接口的所有实现,然后根据接口提供的属性决定使用哪个。

@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 原则。依赖注入是最初连接事物,而不是在运行时动态切换。