web-dev-qa-db-ja.com

Springを使用して存在する場合、外部プロパティファイルのプロパティをオーバーライドする

Spring構成ファイルの1つで次のプロパティファイルが定義されています。

<context:property-placeholder location="classpath:project.properties"/> 

次に、クラスパスにない外部プロパティファイルのいくつかのプロパティをオーバーライドします。

私のプロジェクトをどこかにデプロイしていて、動的な構成変更が必要だとしましょう。コンテナ(Tomcatなど)のプロジェクトコードベースを更新したくありません。

1.)だから、外部プロパティファイルの最近の更新で、スプリングのロードされたプロパティファイルの値を更新(オーバーライド)する方法が必要です。

2.)事前に読み込まれているプロパティを更新する方法を誰かが共有できれば、それは素晴らしいことです。

28
Saurab Parakh

そのため、外部プロパティファイル内の最近の更新で、スプリングのロードされたプロパティファイルの値を更新(オーバーライド)する方法が必要です。

PropertyPlaceholderConfigurer を使用できます。

いずれかの方法context名前空間を使用する場合

<context:property-placeholder location="classpath:yourClasspath.properties,file:/some/resource/path/filePropertiesToOverride.properites"/> 

またはこの方法

<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:yourClasspath.properties</value>
            <value>file:/some/resource/path/filePropertiesToOverride.properites</value>
        </list>
    </property>
</bean>

PropertiesLoaderSupport.setLocations(Resource []) のjavadocによると

...注:キーが重複する場合、後のファイルで定義されたプロパティは、前のファイルで定義されたプロパティをオーバーライドします。したがって、最も具体的なファイルが、指定された場所のリストの最後のファイルであることを確認してください。

事前に読み込まれているプロパティを更新する方法を誰かが共有できれば素晴らしいと思います。

現時点では、PropertyPlaceholderConfigurerを使用しています。 PropertyPlaceholderConfigurerBeanFactoryPostProcessorであるため、Bean定義(beans.xml)プロパティ文字列($ {someProp}など)を置き換えます。その後、Beanはインスタンス化されて初期化されます。したがって、プロパティを「リロード」する方法はありません。

実行時にプロパティの変更に対応できるアプリケーションを構築する場合は、さらに検討する必要があります。

  • 実行時に変更をトリガーするにはどうすればよいですか?例えば。変更のためにプロパティファイルをポーリングするタイマー、JMX、...?
  • プロパティに依存するクラスは、更新についてどのように通知されますか?例えば。リスナー実装。
  • 多くの依存プロパティの更新を同期するにはどうすればよいですか?例えば。同期なしでWebアプリのリクエスト中にプロパティが更新されるとどうなるか想像してみてください。要求の一部では、古いプロパティと別の新しいプロパティが使用される場合があります。

少なくとも Apache commons configuration を使用することをお勧めします。しかし、それはいくつかの問題を解決するフレームワークにすぎず、上記の質問に対する解決策について考える必要があります。

34
René Link

春のブーツ2では、

Java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

詳細は https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html で取得できます。

0
krmanish007