【发布时间】:2019-01-23 20:09:52
【问题描述】:
鉴于特定服务 API 的两个(或更多)实现,根据应用程序属性选择在运行时在我的应用程序中使用哪一个的最佳方法是什么?
示例 API:
public interface Greeting {
String sayHello(String username);
}
实现:
public class FriendlyGreeting implements Greeting {
public String sayHello(String username) {
return "Hello, " + username;
}
}
public class HostileGreeting implements Greeting {
public String sayHello(String username) {
return "Go away, " + username;
}
}
我有一个带有@Autowired 构造函数的单独服务类,它采用Greeting 的实例。我想要的是基于配置属性来决定注入和使用哪个问候实现。我想出了使用配置类来做出决定:
@Configuration
public class GreetingConfiguration {
private String selection;
@Autowired
public GreetingConfiguration(@Value("${greeting.type}") String type) {
this.selection = type;
}
@Bean
public Greeting provideGreeting() {
if ("friendly".equals(selection)) {
return new FriendlyGreeting();
} else {
return new HostileGreeting();
}
}
}
这是做我想做的正确的方法吗?我在实现上使用@Qualifier,结果一团糟,Spring 看到了我的Greeting API 的 3 个实例,无论如何我都需要一个配置来选择要使用的实现并以唯一的方式返回它限定词名称,感觉比我确定的要糟糕。
【问题讨论】:
-
它必须是配置属性还是可以是 Spring 配置文件?因为使用 Profile 会是一种很好且平静的 Springy 方式来做到这一点。之后,根据配置文件,您将提供恶意或友好配置来处理 bean。
-
特别是:在你的组件上有合适的
@Profile注解,并在运行时传递spring.profiles.active和/或spring.profiles.include属性... -
我会查看配置文件,但我认为它们是由我们将应用程序部署到的环境定义的,并且无法真正更改。
-
使用
@Conditionalstackoverflow.com/a/34351004/2958086也可能有帮助