当有多个活动配置文件时加载配置文件特定属性

Loading profile specific proeprties when there are mutiple active profiles

根据 http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html,我可以使用 application-${profile}.properties 加载不同的 application.properties 文件并设置活动配置文件。如果 application.properties 正在改变,那很好,但是如果我需要用 batch.properties 来做这件事呢?如果我有多个活动配置文件怎么办?例如:

spring.active.profile=oracle,hornetq,redis

并且我的属性是使用以下方式加载的:

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    depends-on="datasourceProperty">
    <property name="locations" ref="propLocations" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="order" value="1" />
</bean>
<util:list id="propLocations">
    <value>classpath:batch-default.properties</value>
    <value>classpath*:batch-${profile}.properties</value>
</util:list>

我假设 batch-${profile}.properties 会尝试查找具有任何活动配置文件的所有属性文件,所以 batch-oracle.properties、batch-redis.properties、批量-hornetq.properties

它找到的会使用,没有找到的将被忽略。然而,情况似乎并非如此,根本找不到 ${profile}。

如果我只有一个活动配置文件没问题,我可以只使用 ${spring.active.profile},但我在组件化我的应用程序时正在慢慢创建更多配置文件,我想使用配置文件加载属性而不创建一堆特定于配置文件的 属性 占位符 bean。

-----更新----- 根据 "M. Deinum" 的评论,我尝试了以下操作:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes={BatchBootApplication.class})
@WebIntegrationTest(value={"spring.config.name=application,batch"})
@ActiveProfiles("hsql")
public class BatchBootApplicationTest {

    @Test
    public void testAppContextLoads() {
    }

}

我看到了属性文件。

默认情况下 Spring 引导加载 application.properties 并通过其加载机制加载 application-{profile}.properties(或 yml 文件)。请参阅 Spring 引导参考指南的 External Config section

为了override/extend 加载文件,您可以指定一个spring.config.name 环境变量。该变量可以采用逗号分隔的字符串来标识多个 属性 文件。请参阅示例 here

因此,不要尝试自己破解一些东西,而是使用 Spring Boot.启动应用程序时,只需添加 -Dspring.config.name=application,batch,other file 和 Spring Boot 会将加载规则应用于所有指定的名称。