複数のSpringアクティブプロファイルが指定されている場合の優先順位は何ですかと思っています。
default
プロファイルをアクティブにしたいが、dev
プロファイルがそれからオーバーライドするいくつかの同一の要素(たとえばBean)があるが、プロファイルが異なる場合にそれをオーバーライドするとします...
たとえば、環境プロファイルとして"default"
と"dev"
の値で構成された2つのPropertySourcesPlaceholderConfigurer
Beanがあるとします。
次のプロファイルのアクティブ化を使用する場合:-Dspring.profiles.active="default,dev"
dev
プロファイルはdefault
プロファイルを上書きしますか?
そうでない場合、上記の動作をどのように達成できますか?
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の順序を逆にすると、spring.profiles.active
でのプロファイルの順序に関係なく、dev
バージョンが使用されます。
<context:property-placeholder/>
はBean IDを明示的に指定することができないため、使用しなかったことに注意してください。複数使用した場合の動作はわかりません。プロパティがマージされ、両方で定義されたプロパティが最後の定義を使用するようになると想像しますが、各ファイルに固有のプロパティはそのまま残ります。
それ以外の場合、私の経験では、通常、次の順序でBeanを定義します。
このように、テストプロファイルBeanは、他のプロファイルと組み合わせて使用すると成功します。それ以外の場合は、プロファイルに基づいて、環境固有のBeanまたはデフォルトのBeanを使用します。
superEBは正しいです。Beanの場合、プロファイルの順序は重要ではありません。宣言の順序が重要ですが、プロファイルベースの構成ファイルを使用する場合は順序が重要です。