如果存在多个配置文件中的一个,请禁用Spring配置

neu*_*242 6 profile configuration spring

正如预期的那样,如果moduleTest是活动配置文件,则不会加载此配置:

@Profile({"!moduleTest"})
@Configuration
public class UserConfig {
}
Run Code Online (Sandbox Code Playgroud)

但是,此配置加载:

@Profile({"!moduleTest", "!featureTest"})
@Configuration
public class UserConfig {
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让一个配置无法加载,如果moduleTest 或是 featureTest活动的?

Mic*_*ing 10

有一种简单(未记录,但我认为官方支持)的方法来做到这一点:

@Profile("!moduleTest & !featureTest")
Run Code Online (Sandbox Code Playgroud)

默认情况下,Spring 使用逻辑 OR,这会强制它使用逻辑 AND。

  • 只是添加一些背景信息:该更改是在 https://github.com/spring-projects/spring-framework/commit/1f3b4f1863cdc27f28723659872e5e303ed7e12a 中引入的,距此问题提出近两年了:) (2认同)

cod*_*ent 8

尝试使用条件:

@Configuration
@Conditional(LoadIfNotModuleNorTestProfileCondition.class)
public class UserConfig {
}
Run Code Online (Sandbox Code Playgroud)

LoadIfNotModuleNorTestProfileCondition类:

public class LoadIfNotModuleNorTestProfileCondition implements ConfigurationCondition{

    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.PARSE_CONFIGURATION;
    }

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String[] activeProfiles = context.getEnvironment().getActiveProfiles();
        for (String profile : activeProfiles) {
            if(profile.equalsIgnoreCase("moduleTest") || profile.equalsIgnoreCase("featureTest")){
                return false;
            }
        }
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)