你可以做:
<context:property-placeholder location="classpath:${spring.profiles.active}.properties" />
它工作正常,但在同时使用多个配置文件时可能不适应。
在声明 2 个属性占位符时,如果第一个不包含所有应用程序键,则应将属性忽略 unresolvable = 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/>
恕我直言,这是处理 spring 属性的最佳方式,因为您不再在任何地方声明本地属性,您可以对正在发生的事情进行编程控制,并且可以在 xx2.properties 中使用属性源 xx1 值。
在工作中,我们正在使用它,它运行良好。我们注册了 3 个额外的属性来源: - 基础设施:由 Puppet 提供 - 配置文件:根据配置文件加载的不同属性。- 通用:包含默认值,当所有配置文件共享相同的值等...