簡體   English   中英

如何將環境自動連接到PropertySourcesPlaceholderConfigurer?

[英]How to autowire Enviroment into a PropertySourcesPlaceholderConfigurer?

我試圖設置我的Spring應用程序,以便根據配置配置文件讀取不同的.properties文件。 我正在使用Java配置,所以我想做的是這樣的:

@Autowired
private static Environment env;

@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
    String[] profiles = env.getActiveProfiles();
    String filestring = "environment."+profiles[0]+".properties";
    ClassPathResource properties = new ClassPathResource( filestring );
    Resource[] resources = new ClassPathResource[] { properties };
    pspc.setLocations( resources );
    return pspc;
}

但是env.getActiveProfiles()給了我NullPointerException ,我認為這意味着尚未注入環境。 任何人都知道如何解決此問題? 或者,如果這是愚蠢的/不可能的,我該如何做得更好?

只是為您提供一種替代方法的觀點(顯然每個項目的業務案例可能因項目而異),但是您追求的配置類型可能會導致其他麻煩。 想到安全性。 通常,多個環境意味着您要處理與數據庫等的各種連接的用戶名和密碼。 根據您的其他配置為生產環境存儲這些值可能會將敏感數據暴露給不需要此類知識的開發人員。 相反,如果您使用SPeL表達式進行切換並直接引用環境,那么您仍然可以實現運行時配置,但是將每個環境的設置移動到應用這些特定配置的服務器(或您擁有的)。 例:

<bean id="myDatabase" class="mypackage.MyDatabase" p:username="#{environment['DB_USERNAME']}" p:password="#{environment['DB_PASSWORD']}" .../>

然后在服務器上,您可以傳入系統屬性或使用所需的用戶名和密碼設置環境變量,它們將在運行時進行配置。 environment表達式直接解析為您的Environment實例。)

只是一個想法。 =)

正如@ kungfuters正確建議的,該業務案例可能因應用程序而異。 這是適用於我的應用程序的另一種選擇。

提供以下接口的實現:

ApplicationContextInitializer<ConfigurableApplicationContext>

提供以下方法的實現。 識別配置文件的邏輯在此方法中。

initialize(ConfigurableApplicationContext ctx) 

根據標識,設置活動配置文件:

this.applicationContext.getEnvironment().setActiveProfiles(<<yourProfileName>>)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM