我需要添加一个接口的多个实现,其中一个应该根据配置文件来选择。
例如
interface Test{
public void test();
}
@Service
@Profile("local")
class Service1 implements Test{
public void test(){
}
}
@Service
class Service2 implements Test{
public void test(){
}
}
@SpringBootApplication
public class Application {
private final Test test;
public Application(final Test test) {
this.test = test;
}
@PostConstruct
public void setup() {
test.test();
}
}
我的意图是当我使用 -Dspring.profiles.active=local 时,应该调用 Service1,或者应该调用 service2,但我得到一个异常测试的 bean 丢失。
为Service2
添加默认配置文件:
@Service
@Profile("default")
class Service2 implements Test{
public void test(){
}
}
仅当未标识其他配置文件时,才会将 Bean 添加到上下文中。如果您传入不同的配置文件,例如 -Dspring.profiles.active="demo",则忽略此配置文件。
如果要使用除本地以外的所有配置文件,请使用 NOT 运算符:
@Profile("!local")
如果给定配置文件以 NOT 运算符 (!( 为前缀,则在配置文件未处于活动状态时将注册带注释的组件
您可以将@ConditionalOnMissingBean
添加到 Service2,这意味着它只会在没有其他实现的情况下使用,这将有效地使 Service2 成为除本地以外的任何其他配置文件中的默认实现
@Service
@ConditionalOnMissingBean
class Service2 implements Test {
public void test() {}
}