你可以這樣做:
<context:property-placeholder location="classpath:${spring.profiles.active}.properties" />
它工作正常,但在同時使用多個配置文件時,可能不適合。
在聲明2個財產佔位符,如果第一個不包含所有的應用程序鍵,你應該把忽略無法解決的= TRUE的屬性,以便於第二個佔位符都可以使用。 我不確定它是否是您想要做的事情,如果您希望xx1和xx2配置文件在同一時間內處於活動狀態,則可能會這樣做。
請注意,聲明2個像這樣的屬性佔位符使它們是獨立的,並且在xx2.properties的聲明中,不能重用xx1.properties的值。
如果您需要更先進的東西,您可以在應用程序啓動時註冊您的PropertySources。
的web.xml
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.xxx.core.spring.properties.PropertySourcesApplicationContextInitializer</param-value>
</context-param>
文件創建:
public class PropertySourcesApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final Logger LOGGER = LoggerFactory.getLogger(PropertySourcesApplicationContextInitializer.class);
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
LOGGER.info("Adding some additional property sources");
String profile = System.getProperty("spring.profiles.active");
// ... Add property sources according to selected spring profile
// (note there already are some property sources registered, system properties etc)
applicationContext.getEnvironment().getPropertySources().addLast(myPropertySource);
}
}
一旦你做到了,你只需要在您的上下文中添加:
<context:property-placeholder/>
恕我直言,它的處理彈簧屬性的最佳方法,因爲你不再在任何地方聲明本地屬性,你可以通過程序控制發生了什麼事情,並且可以在xx2.properties中使用屬性來源xx1值。
在工作中,我們正在使用它,它很好地工作。我們註冊了3個其他財產來源: - 基礎設施:由Puppet提供 - 個人資料:根據個人資料加載的不同屬性。 - 通用:包含默認值,當所有配置文件共享相同的值等...
您是否使用maven構建您的項目?我相信Maven有一種使用過濾器對屬性文件名進行令牌替換的方法。 – jeff
我確實使用Maven,但似乎很奇怪Spring沒有提供它自己的方式來做到這一點。 – Luciano