web-dev-qa-db-ja.com

spring.profiles.activeによって設定された複数のSpringの環境プロファイルがある場合の優先順位は何ですか

複数のSpringアクティブプロファイルが指定されている場合の優先順位は何ですかと思っています。

defaultプロファイルをアクティブにしたいが、devプロファイルがそれからオーバーライドするいくつかの同一の要素(たとえばBean)があるが、プロファイルが異なる場合にそれをオーバーライドするとします...

たとえば、環境プロファイルとして"default""dev"の値で構成された2つのPropertySourcesPlaceholderConfigurer Beanがあるとします。

次のプロファイルのアクティブ化を使用する場合:-Dspring.profiles.active="default,dev"

devプロファイルはdefaultプロファイルを上書きしますか?

そうでない場合、上記の動作をどのように達成できますか?

27
balteo

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を定義します。

  1. プロファイルに固有ではない「デフォルト」のBean定義
  2. 環境固有のプロファイルでのBean定義のオーバーライド
  3. テスト固有のプロファイルでのBean定義のオーバーライド

このように、テストプロファイルBeanは、他のプロファイルと組み合わせて使用​​すると成功します。それ以外の場合は、プロファイルに基づいて、環境固有のBeanまたはデフォルトのBeanを使用します。

17
superEb

superEBは正しいです。Beanの場合、プロファイルの順序は重要ではありません。宣言の順序が重要ですが、プロファイルベースの構成ファイルを使用する場合は順序が重要です。

3