2

カスタム プロパティ プレースホルダーを Spring の新しいサポートに移植しようとしてEnvironmentいますが、現在のプレースホルダー マジックの機能を取得する方法がわかりません。

私が望むのは、デフォルトの一連のプロパティ ファイルをクラスパスから読み取り、それらのプロパティを別の場所からの一連のプロパティ ファイルによってオーバーライド (オーバーレイ) することです。他のグループのファイルに設定されているものだけをすべてのプロパティに置き換えたくありません。

Spring 3.1 より前

<bean class="com.snaphop.spring.ConfigResourcesFactoryBean" id="customConfig">
    <property name="parameterName" value="customConfig"/>
    <property name="defaultResources" value="classpath*:META-INF/spring/*.properties"/>
</bean>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="customPropertyPlaceholder">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="locations" ref="customConfig"/>
</bean>

これで ConfigResourcesFactoryBean は、プレースホルダー構成にフィードするリソースのリストを見つける魔法のような FactoryBean になりました。

public class ConfigResourcesFactoryBean implements FactoryBean<Resource[]> {
// Loads a bunch of Resources (property files) 
// based on System.property/Environment variable "customConfig"
}

customConfig は-DcustomConfig=file://blah/*.propertiesまたはのように設定できますexport customConfig=file://blah/*.properties

ディレクトリのプロパティはblahclasspath*:META-INF/spring/*.properties. Resource[]したがって、工場から返されたものはclasspath*:META-INF/spring*.properties、それぞれに続くの結合になりfile://blah/*.propertiesます。

Resource[]これで、工場の代わりにカスタムPropertySourcesを作成して PlaceholderConfig に配線できるようになりましたが、上記の値を提供していないようです。

サーブレット環境でのみ機能し、したがって統合テストでは機能しないことを誓うため、使用できませんApplicationContextInitializer(単体テストのすべてに注釈を追加して、環境が何であるかを伝える気がしません前に行ったようにシステム プロパティを設定します)。

一連のクラスをオーバーライド/実装することなく、ハードコードされたソースのプロパティをカスタム ソースでオーバーレイするにはどうすればよいですか?

4

1 に答える 1

0

時間の経過とともに、元の構成解決コードを新しい Spring Environment のやり方にゆっくりと移植しました。

これについては、この StackOverflow Question: IntelliJ を使用して環境固有のランタイム構成を簡単に切り替えるにはどうすればよいですか?

コードを Gist として見ることができ、Spring プロジェクトのほとんどで使用しているのと同じ構成ロジックを使用できます。

残念ながら単体テストの場合、Context Initializer は実際には Spring 3.2 でのみ機能します。更新された@ContextConfiguration注釈を参照してください。Spring 3.1 以前を使用するプロジェクトには、古いカスタム プロパティ プレースホルダーを使用する必要がありました。

于 2014-06-02T14:40:54.663 に答える