我有一个Spring Boot应用程序,有不同的配置文件设置:
两个配置类如下设置。
当我使用配置文件
但是,当我使用配置文件
文档(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html)中有一个包含一个配置文件和排除另一个配置文件的示例。在我的示例中,我将两个配置文件都排除了:
dev
,prod
,qc
,console
等。两个配置类如下设置。
MyConfigurationA
应该在除了 console
之外的所有配置文件中注册。 MyConfigurationB
应该在除了 console
和 dev
的所有配置文件中注册。当我使用配置文件
console
运行应用程序时,MyConfigurationA
不会被注册 - 这是可以接受的。但是 MyConfigurationB
被注册了 - 这并不是我想要的。我已经按照以下方式设置了 @Profile
注释,以便在配置文件 console
和 dev
中不注册 MyConfigurationB
。但是,当我使用配置文件
console
运行应用程序时,MyConfigurationB
仍然被注册了。@Profile({ "!" + Constants.PROFILE_CONSOLE , "!" + Constants.PROFILE_DEVELOPMENT })
文档(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html)中有一个包含一个配置文件和排除另一个配置文件的示例。在我的示例中,我将两个配置文件都排除了:
@Profile({"!p1", "!p2"})
。
@Profile({"p1", "!p2"})
,如果激活了配置文件 'p1' 或者 没有激活配置文件 'p2',就会发生注册。
我的问题是:我们如何跳过两个配置文件的配置注册?@Profile({"!p1", "!p2"})
是 OR 运算。我们需要 AND 运算。
代码:
@Configuration
@Profile({ "!" + Constants.PROFILE_CONSOLE })
public class MyConfigurationA {
static{
System.out.println("MyConfigurationA registering...");
}
}
@Configuration
@Profile({ "!" + Constants.PROFILE_CONSOLE , "!" + Constants.PROFILE_DEVELOPMENT }) // doesn't exclude both, its OR condition
public class MyConfigurationB {
static{
System.out.println("MyConfigurationB registering...");
}
}
public final class Constants {
public static final String PROFILE_DEVELOPMENT = "dev";
public static final String PROFILE_CONSOLE = "console";
...
}