如何在春季基于配置文件调用Bean的不同实现

时间:2019-04-29 10:34:38

标签: java spring spring-boot spring-profiles

我需要添加一个接口的多个实现,并且应根据配置文件选择其中一个。

例如

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。

2 个答案:

答案 0 :(得分:2)

Service2添加default个人资料:

@Service
@Profile("default")
class Service2 implements Test{
    public void test(){

    }
}
  

仅当未标识其他配置文件时,才会将bean添加到上下文中。如果您输入其他个人资料,例如-Dspring.profiles.active =“ demo”,此配置文件将被忽略。

答案 1 :(得分:0)

您可以将@ConditionalOnMissingBean添加到Service2,这意味着它将仅在不存在其他实现的情况下使用,这将有效地使Service2成为除本地以外的任何其他配置文件中的默认实现

@Service
@ConditionalOnMissingBean
class Service2 implements Test {
    public void test() {}
}