我有一个接口的两个实现,我想根据配置选择要使用的实现。限定符解决方案不起作用,因为它是在配置之前初始化的。我怎样才能做到这一点?
我收到了你的评论:
我有两个不同的作业实现,并且可以每月更改类型,因此如果可配置,则可以减少部署和代码更改。
你可能有这样的事情:
interface Job {
void foo();
}
class JobA implements Job {
void foo() {...}
}
class JobB implements Job {
void foo() {...}
}
class JobExecutor {
Job job;
// autowired constructor
public JobExecutor(Job job) {this.job = job;}
}
而且,如果我没听错的话,在同一个应用程序上下文中同时加载两个 bean 是没有意义的。
但如果是这样,则@Qualifier不是适合这项工作的工具。
我建议改用集成到 spring boot 中的条件:
@Configuration
public class MyConfiguration {
@ConditionalOnProperty(name = "job.name", havingValue = "jobA")
@Bean
public Job jobA() {
return new JobA();
}
@ConditionalOnProperty(name = "job.name", havingValue = "jobB")
@Bean
public Job jobB() {
return new JobB();
}
@Bean
public JobExecutor jobExecutor(Job job) {
return new JobExecutor(job);
}
}
现在在application.properties(或任何你拥有的 yaml)中定义:
job.name = jobA # or jobB
当然,jobA/jobB您可能会使用来自您的业务领域的更多不言自明的名称来代替。
慕盖茨4494581
慕尼黑的夜晚无繁华
蝴蝶刀刀
神不在的星期二
相关分类