2016-02-07 127 views
5

我已经与不同资料设置一个弹簧引导应用注册:devprodqcconsole弹簧引导配置跳过多个@profile

两个配置类是设置如下。 MyConfigurationA应注册所有配置文件,但console除外。 MyConfigurationB应当予以登记,除了consoledev

当我使用配置文件console运行应用程序时,MyConfigurationA未注册 - 这很好。但MyConfigurationB获得注册 - 我不想要。我设置了@Profile注释如下,以不型材consoledev注册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' 是活跃OR发生登记,如果配置文件 'P2'不活跃。

我的问题是:我们如何可以跳过这两个配置文件的配置注册? @Profile({"!p1", "!p2"})正在进行或操作。我们在这里需要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"; 
    ... 
} 

回答

8

@Profile({"!console", "!dev"})装置(未控制台)OR(NOT DEV)如果您运行的配置文件 '控制台' 您的应用程序是正确的。
为了解决这个问题,你可以创建自定义Condition

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 { 
+0

这是正确的!谢谢.. – gtiwari333