2016-07-22 33 views
1

我可以控制基于我传递给应用程序的参数在我的应用程序上下文的Spring bean是否被实例化多春@Profiles管辖?排除豆通过在同一时间

实施例:

如果我在

设置弹簧型材

ANT的build.xml jvmarg为: -Dspring.profiles.active=P1,P2

对于在配置类下面的代码片断:

@Bean 
@Profile({"!P1", "!P2"}) 
public String P3() { 
    String s = "Check1:P3"; 
    System.out.println(s); 
    return s; 
} 

@Bean 
@Profile({"!P1", "!P3"}) 
public String P2() { 
    String s = "Check2:P2"; 
    System.out.println(s); 
    return s; 
} 


@Bean 
@Profile({"!P2", "!P3"}) 
public String P1() { 
    String s = "Check3:P1"; 
    System.out.println(s); 
    return s; 
} 

@Bean 
@Profile("P3") 
public String P3_1() { 
    String s = "Check4:P3"; 
    System.out.println(s); 
    return s; 
} 

@Bean 
@Profile("P1") 
public String P1_1() { 
    String s = "Check5:P1"; 
    System.out.println(s); 
    return s; 
} 
@Bean 
@Profile("P2") 
public String P2_1() { 
    String s = "Check6:P2"; 
    System.out.println(s); 
    return s; 
} 

我得到的输出:

Check2:P2 
Check3:P1 
Check5:P1 
Check6:P2 

这是正确的。

但是,当我设置的配置文件中的build.xml为:

-Dspring.profiles.active=P1 

Output: 
Check1:P3 
Check2:P2 
Check3:P1 
Check5:P1 

但按我的期望,我希望能得到像输出:

Check3:P1 
Check5:P1 

(IE)只P1 ()bean在运行时启动。

任何人都可以给我建议,如果这是可能的@Profiles? 我可以根据配置文件的排除规则来控制运行时启动的bean吗? 或者我该如何做到这一点?

的基本要求是,如果有“N”豆。根据我传递给环境/服务器目标的参数,我可以控制1个bean在运行时启动。

我试图利用其可以通过不同的环境中使用的共享码(其中,所有的bean被定义)(要求每个bean来开特定环境)?

回答

1

大概配置文件不适合这个。

您可能会改用普通的属性。

检查@条件注释(Spring 4)和更方便@ConditionalOnExpression(“$ {P1}”)(仅在Spring引导中可用)。

另一种选择 - 你@Configuration类里面的一些手工逻辑,例如:

@Value("${P1}") boolean isP1; 

@Bean String p1OrP2() { 
    return (isP1) ? "P1" : "P2"; 
} 

这可能在通常情况下是不够的,例如通过这种方式,您可以控制是否使用某个特性(使用完整的实现bean)或不使用(使用一些具有最小行为的bean)。

+0

另请参见Spring Boot中的@ ConditionalOnProperty注解。 – jhyot

0

通过融合ServiceLocatorFactoryBean和Spring Profiles的概念,我能够通过共享的编排代码库解决我的应用程序按需自举的问题。

链接: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/ServiceLocatorFactoryBean.html http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

春谱有助于在作为环境/应用程序上下文和定位器工厂创建一个实现该接口的动态代理指定的按需创建豆类,委托给一个潜在的BeanFactory,因此通过使用适当的自定义定位器接口,从BeanFactory API解耦调用代码

相关问题