2016-07-22 57 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解耦調用代碼

相關問題