弹簧引导配置跳过多个@Profile上的注册

2022-09-01 16:38:19

我有一个具有不同配置文件设置的Spring Boot应用程序:,,,等。devprodqcconsole

这两个配置类的设置如下所示。 应为所有配置文件注册,但 . 应注册,但 和 除外。MyConfigurationAconsoleMyConfigurationBconsoledev

当我使用配置文件运行应用程序时,不会注册 - 这很好。但是被注册了 - 我不想要。我已按如下方式设置了注释,以便不注册 for 配置文件和 .consoleMyConfigurationAMyConfigurationB@ProfileMyConfigurationBconsoledev

但是,当我使用配置文件运行应用程序时,正在注册。MyConfigurationBconsole

@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”未处于活动状态,则将发生注册。

我的问题是:如何跳过两个配置文件的配置注册? 正在执行 OR 操作。我们需要在这里进行和操作。@Profile({"!p1", "!p2"})


验证码 :

@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";
    ...
}

答案 1

@Profile({"!console", "!dev"})意味着(不是控制台)(不是开发),如果您使用配置文件“控制台”运行应用程序,则为真。
要解决此问题,您可以创建自定义条件

public class NotConsoleAndDevCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        return !environment.acceptsProfiles("console", "dev");
    }
}

并通过@Conditional注释将条件应用于配置:

@Conditional(NotConsoleAndDevCondition.class)
public class MyConfigurationB {

答案 2

从 Spring 5.1 开始,您可以在注记中使用表达式。在@Profile文档中阅读更多内容。例:@Profile

@Configuration
@Profile({ "!console & !dev" }) 
public class MyConfigurationB {
    static{
        System.out.println("MyConfigurationB registering...");
    }
}

推荐