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

标签 java spring spring-bean spring-profiles

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

public interface ExternalService {
// ...
}

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

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

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

问题:然而,现在我第一次在这样的情况下运行,我实际上有两个相同接口(interface)的实际实现。其中一个被定义为主要的,但另一个也可以通过从应用程序上下文中加载来使用。

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

最佳答案

原来答案非常简单:在配置文件名称前添加一个非运算符 (!):

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

这种方式只在 stub-profile 不活动时加载 bean。 Spring 3.2 M1 中添加了对该功能的支持。 .

但有一个警告:如果您编写 @Profile({"!stub", "foo"}),逗号将被视为“或”,而不是“与”。因此,如果 stub 未激活或 foo 激活,则此示例 bean 将被激活。

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

关于java - 设置某个配置文件时不加载 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076557/

相关文章:

java - 将 JAR 文件作为依赖项添加到没有其相关 JAR 的项目中

java - MongoDB 更新嵌套数组的元素

java - HotSwapAgent 无法将 filePath 转换为 classPathPath

grails - 如何在每个测试中更改类的metaClass

java - 为什么我无法运行我的 hello swing 应用程序?

java - 如何使用java将文档插入到bitbucket?

spring - 使用 grails bean 定义将闭包传递给 spring bean

java - Spring:在 Autowiring 组件时选择构造函数

mysql - 访问 Hibernate DAO 时出现 NullPointer 错误

java - 服务器返回 HTTP 响应代码 : 505 for URL