我只是想知道在指定多个Spring活动配置文件时优先顺序是什么。
假设我希望default
配置文件处于活动状态,但dev
配置文件可以覆盖它,当有多个相同的元素(例如bean)可供选择但具有不同的配置文件时...
比方说,我有两个PropertySourcesPlaceholderConfigurer
bean配置了"default"
和"dev"
值环境配置文件。
如果我使用以下配置文件激活:-Dspring.profiles.active="default,dev"
dev
个人资料会覆盖default
个吗?
如果不能如何实现上述行为?
答案 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:
这样,如果与其他配置文件结合使用,测试配置文件bean将获胜;否则,您将根据配置文件使用特定于环境的bean或默认bean。
答案 1 :(得分:6)
最后一个定义获胜。我牢记在心,但是:
请记住,如果您在jar资源中有一些application.properties的默认内容,那么此资源内容将覆盖不太重要的配置文件(先前在spring.profiles.active
中定义的其他配置文件)的外部内容中的条目,这一点非常重要。
示例个人资料:spring.profiles.active=p1,p2,p3
jar资源中的文件:application-p1.properties
和application-p3.properties
外部文件:application-p1.properties
和application-p2.properties
最终订单为(最后获胜):
application.properties
application.properties
application-p1.properties
application-p1.properties
application-p2.properties
application-p3.properties
-这里就是把戏!这将使用资源版本p3中的值覆盖在p1和p2的外部文件中定义的属性 application-p3.properties
因此请记住,最后胜利,而且资源紧随外部而已
答案 2 :(得分:3)
superEB是正确的,配置文件的顺序对bean来说无关紧要,声明顺序在那里更重要,但请记住,如果使用基于配置文件的配置文件,顺序很重要!