0

構成ファイルには特定の形式があります。複数のファイル(つまり、dev.properties、uat.properties、prod.properties)を使用する代わりに、すべての値を1つのファイルに保存しますが、環境ごとにプレフィックスで区切ります。例えば:

SERVICE_PORT = 9800

DEV_SERVICE_PORT = 7800

UAT_SERVICE_PORT = 6600

これらの値を検索する既存のクラス(PropertyPlaceholderConfigurerのサブクラス)があり、実行中のIPアドレスに基づいてresolvePlaceHolder()内に追加するプレフィックスを決定します。つまり、特定のIP範囲では、DEV_プレフィックスを使用します。 UAT_プレフィックスを使用します。次に、これらの値は他のBeanに渡されます。場合によっては、コンテキストxmlを使用し、一部のBeanコンストラクターで@ Value${}アノテーションを使用します。プレフィックスの使用は透過的であるため、他のすべての構成はSERVICE_PORTを使用します(例では)

これを変更して、IPを使用する代わりに、アクティブなSpringプロファイルを検出するようにします。web.xmlには、環境のタイプを示すjavaSystemプロパティを検出するカスタムApplicationContextIniitalizerがあります。

私が抱えている問題は、resolvePlaceHolder()が呼び出された時点で、アクティブなプロファイルがまだ存在しないように見えることです。アクティブなプロファイルを検出するために私が行っていることは次のとおりです。

  1. StandardEnvironmentのインスタンスを作成します
  2. getActiveProfiles()を呼び出す

(2)常に空の配列を返すようです。これは、Springプロファイルがアクティブ化される前にプロパティプレースホルダーの解決が行われることを意味します。これは正しいです??

Beanの作成、プロパティファイルのロードなど、Springコンテキストのロード中の他のイベントに関連して、アクティブなプロファイルはいつ設定されますか?

resolvePlaceHolder()が呼び出されたときにアクティブなプロファイルを検出することは可能ですか?代わりに別のクラスを拡張する必要がありますか?

4

1 に答える 1

1

プロファイルの状態を照会したり、プロパティを直接解決したりするために、内で管理されているBeanはbeまたはEnvironmentにApplicationContext登録でき ます。EnvironmentAware@Inject

[ソース:Environmentjavadocs ]

のインスタンスを作成しないでくださいStandardEnvironment、それをあなたのBeanに注入してください!

于 2012-11-15T17:15:59.567 に答える