当spring.profiles.active设置了多个Spring的环境配置文件时,优先顺序是什么

时间:2014-05-12 20:03:28

标签: spring spring-profiles

我只是想知道在指定多个Spring活动配置文件时优先顺序是什么

假设我希望default配置文件处于活动状态,但dev配置文件可以覆盖它,当有多个相同的元素(例如bean)可供选择但具有不同的配置文件时...

比方说,我有两个PropertySourcesPlaceholderConfigurer bean配置了"default""dev"值环境配置文件。

如果我使用以下配置文件激活:-Dspring.profiles.active="default,dev"

dev个人资料会覆盖default个吗?

如果不能如何实现上述行为?

3 个答案:

答案 0 :(得分:16)

spring.profiles.active系统属性中配置文件的顺序并不重要。 "优先级"由bean的声明顺序定义,包括特定于配置文件的bean,最后一个bean定义获胜

使用您的示例,如果使用-Dspring.profiles.active="default,dev"props配置文件中的default bean将在此处使用,原因只是因为它是该bean的最后一个活动定义:

<beans profile="dev">
    <bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:META-INF/dev.properties"/>
    </bean>
</beans>
<beans profile="default">
    <bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:META-INF/default.properties"/>
    </bean>
</beans>

反转bean的顺序,然后使用dev版本,无论spring.profiles.active中的配置文件的排序方式如何。

请注意,我没有使用<context:property-placeholder/>,因为它不允许您明确指定bean ID,因此我不确定如果使用多个行为,它会表现出什么样的行为。我想这些属性将被合并,因此两者定义的属性将使用最后一个定义,但特定于每个文件的属性将保持不变。

否则,根据我的经验,您通常会按以下顺序定义bean:

  1. &#34;默认&#34; bean定义,不是特定于配置文件
  2. 在特定于环境的配置文件中覆盖bean定义
  3. 在特定于测试的配置文件中覆盖bean定义
  4. 这样,如果与其他配置文件结合使用,测试配置文件bean将获胜;否则,您将根据配置文件使用特定于环境的bean或默认bean。

答案 1 :(得分:6)

最后一个定义获胜。我牢记在心,但是:

请记住,如果您在jar资源中有一些application.properties的默认内容,那么此资源内容将覆盖不太重要的配置文件(先前在spring.profiles.active中定义的其他配置文件)的外部内容中的条目,这一点非常重要。

示例个人资料:spring.profiles.active=p1,p2,p3

jar资源中的文件application-p1.propertiesapplication-p3.properties

外部文件:application-p1.propertiesapplication-p2.properties

最终订单为(最后获胜):

  1. 资源 application.properties
  2. 外部application.properties
  3. 资源 application-p1.properties
  4. 外部application-p1.properties
  5. 外部application-p2.properties
  6. 资源 application-p3.properties-这里就是把戏!这将使用资源版本p3中的值覆盖在p1和p2的外部文件中定义的属性
  7. 外部application-p3.properties

因此请记住,最后胜利,而且资源紧随外部而已

答案 2 :(得分:3)

superEB是正确的,配置文件的顺序对bean来说无关紧要,声明顺序在那里更重要,但请记住,如果使用基于配置文件的配置文件,顺序很重要!