设置某个配置文件时不加载Spring bean

时间:2014-08-01 09:02:37

标签: java spring spring-bean spring-profiles

背景:所以,我有几个bean连接外部系统。对于开发,模拟外部系统并用一些产生或多或少静态响应的实现来替换接口bean是很方便的。所以我一直在做的是创建一个接口,真正的实现和这样的存根实现:

public interface ExternalService {
// ...
}

@Service
public class ExternalServiceImpl implements ExternalService {
// ...
}

@Service
@Primary
@Profile({"stub"})
public class StubExternalService implements ExternalService {
// ...
}

...这很有效:如果存根配置文件不存在,则根本不会加载存根bean。如果存在,由于@Primary注释,它很好地取代了真正的实现。

问题:然而,现在,我已经第一次运行,因为我实际上已经实现了相同界面的两个实际实现。其中一个被定义为主要的,但另一个也可以通过从应用程序上下文加载它来使用。

我仍然希望创建一个存根服务来替换它们,但这次我将存根定义为@Primary的旧方法不起作用,因为已经有一个主要实现。基本上我需要的是在设置存根配置文件时不加载主bean的方法,但我对如何做到这一点感到茫然。网络搜索或其他Stack Overflow问题似乎没有帮助。

1 个答案:

答案 0 :(得分:15)

事实证明,答案非常简单:在个人资料名称前添加一个非运算符(!):

@Service
@Primary
@Profile({"!stub"})
public class ExternalServiceImpl implements ExternalService {
// ...
}

这样,只有在stub - 配置文件未激活时才会加载bean。 Spring 3.2 M1已添加对此功能的支持。

但有一点需要注意:如果你写@Profile({"!stub", "foo"}),则逗号被视为“或”,而不是“和”。因此,如果stub未激活或foo处于活动状态,则会激活此示例bean。

编辑/添加:Spring 5.1添加了对new expression language for profiles的支持:当!stub & foo未激活且stubfoo时,production & (us-east | eu-central)被激活活性。巨大的成功!如果您使用括号,您甚至可以混合使用ands和ors:{{1}}。

相关问题