为了账号安全,请及时绑定邮箱和手机立即绑定

spring如何根据profile调用bean的不同实现

spring如何根据profile调用bean的不同实现

拉丁的传说 2022-10-26 15:53:55
我需要添加一个接口的多个实现,并且应该根据配置文件选择其中一个。例如interface Test{    public void test();}@Service@Profile("local")class Service1 implements Test{    public void test(){    }}@Serviceclass Service2 implements Test{    public void test(){    }}@SpringBootApplicationpublic 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,但我得到一个异常,即缺少 Test 的 bean。
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

添加默认配置文件Service2:


@Service

@Profile("default")

class Service2 implements Test{

    public void test(){


    }

}

只有在没有识别出其他配置文件时,才会将 bean 添加到上下文中。如果您传入不同的配置文件,例如 -Dspring.profiles.active="demo",则忽略此配置文件。


如果您想要除本地使用NOT 运算符之外的所有配置文件:


@Profile("!local")

如果给定配置文件以 NOT 运算符 (!) 为前缀,则在配置文件未激活时将注册带注释的组件


查看完整回答
反对 回复 2022-10-26
?
富国沪深

TA贡献1790条经验 获得超9个赞


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


@Service

@ConditionalOnMissingBean

class Service2 implements Test {

    public void test() {}

}


查看完整回答
反对 回复 2022-10-26
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信