2011-03-09 7 views
2

私は、SpringのPropertyPlaceholderConfigurerをアプリケーションコンテキストファイルで使用するコードを変更しています。プロパティは正常に読み取られ、アプリケーションで使用されます。しかし、私が<import resource="classpath:/my/class/path/${my.file.name}" />でPropertyPlaceholderConfigurer宣言をたどると、 "Could not resolve placeholder 'my.file.name'"というエラーと一連の例外がスローされます。 PropertyPlaceholderConfigurerを宣言した後すぐにプロパティを利用できますか?そうでない場合は、どの時点で利用可能になるのでしょうか?Springプロパティプレースホルダが読み込んだプロパティはすぐに利用できますか?

答えて

2

春のコンテキストファイルでは複数の処理が行われるため、利用可能なプロパティはどのパスであるのかという問題です。残念ながら、<import>タグは、Bean宣言より前のパス(例えば、PropertyPlaceholderConfigurerのタグ)で処理されるため、使用しようとしている方法では利用できません。

あなたがしようとしていることは、Springの共通のことであり、さまざまな解決策があります。彼らはしばしば注入を行うためにあなたのビルドを変更する必要があります。環境ごとのバネ設定のためのグーグル/スタックオーバーフローが何かを起こすはずです。私はSpring 3.1が環境ごとの設定を可能にする機能を提供することを読んでいます( "test"ビルドを行っている場合は "this"プロパティファイルを使用し、 "dev"ビルドを行っている場合はこれを使用します)しかし、私はこの時点でそれについて多くを知らない。

+0

これは正しい軌跡です。ただし、import文は実際に別のコンテキストファイルを読み込んでいます。私の目的は、my.file.nameの値に応じて別のコンテキストファイルをロードすることです。各コンテキストファイルには、異なるプロパティファイルをロードするだけではなく、基本的なキャッシングメカニズムの実装が異なります。これを行うためのよりよい方法に関する考えはありますか? – Adam

+0

私がこれをやったやり方は、過去には、インポートXMLの名前をプロパティで定義するのではなく、XMLファイルの "all"をインポートして、注入するBeanのIDを定義するプロパティを持つことです。だから、あなたのさまざまなキャッシングメカニズムをすべて含むxmlをインポートすると、実際に注入(および使用)されるIDはプロパティによって定義されます。それは必ずしも理想的ではありませんが、仕事を終わらせます。 – Melv

+0

このメソッドは、使用されているかどうかにかかわらず、各xmlのBeanをインスタンス化しますか? – Adam

3

PropertyPlaceHolderConfigurer(BeanFactoryPostProcessor)がプロパティプレースホルダーを解決する前に、インポートリソースが解決されます。解決済みのリソース名をインポートに配置する必要があります。

PropertyPlaceHolderConfigurerはBeanFactoryPostProcessorなので、Bean定義がSpring設定ファイルからロードされると呼び出されます。

関連する問題