如果存在多个配置文件之一,则禁用 Spring 配置

Disable Spring Configuration if one of several profiles is present

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

@Profile({"!moduleTest"})
@Configuration
public class UserConfig {
}

但是,此配置加载:

@Profile({"!moduleTest", "!featureTest"})
@Configuration
public class UserConfig {
}

如果 moduleTest featureTest 加载的配置活跃?

尝试使用条件:

@Configuration
@Conditional(LoadIfNotModuleNorTestProfileCondition.class)
public class UserConfig {
}

LoadIfNotModuleNorTestProfileCondition class:

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;
    }

}

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

@Profile("!moduleTest & !featureTest")

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