5

次のようなカスタム注釈を追加する手段を作成する必要があります

@Value("${my.property}")

ただし、私の場合は、プロパティ ファイルではなくデータベースから値を取得する必要があります。

基本的に、データベースからプロパティ名と値のペアを読み取り、これらを他の Bean に属するフィールドに注入できるコンテナーの起動時に Bean を作成したいと考えています。

4

3 に答える 3

9

アプローチ #1:

1 つの方法は、このアノテーションを持つ任意のメソッドに一致するポイントカット式を使用して、アスペクトを作成することです。

あなたのアスペクトは次のようになります。

  • 注釈のプロパティ値を読み取る
  • 必要な値を調べて、クラスに挿入します。

AOP キックスタート

これは、Spring で AOP を開始するためのガイドです。

http://www.tutorialspoint.com/spring/aop_with_spring.htm

ジョインポイント マッチング

注釈に一致する結合ポイントを作成する方法を説明するリファレンスを次に示します: http://eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html

アプローチ #2:

もう 1 つの方法は、BeanFactoryPostProcessorを使用することです。これは基本的に、PropertyPlaceholderConfigurer がどのように機能するかです。

  • Bean 定義を調べて、基礎となるクラスを取得します。
  • 次に、リフレクションを使用して、クラス内の注釈をチェックします。
  • Bean 定義を更新して、アノテーションの値に従ってプロパティを注入します。

. . 実際、アプローチ#2はあなたが望むものにもっと似ていると思います-すべての処理は「起動」時に行われます。. . (実際には、起動前であっても Bean レシピを変更します)。. 一方、AOP を使用すると、メソッド呼び出しをインターセプトすることになり、遅すぎる可能性があります。

名前空間ハンドラー

必要に応じて、独自の Spring名前空間ハンドラーを作成して、ポスト プロセッサを簡潔な方法でオンにすることもできます。例えば:

<myApp:injectFromDb />

代わりに:

<bean class="MyDatabaseLookupProcessorImpl etc, etc. />

更新: アプローチ #3

Spring 3.1 の時点で、PropertySourcesPlaceholderConfigurerもあり、ほとんどの配管が提供されるため、より少ないコードでこれを実現できます。

于 2013-10-11T11:05:23.897 に答える
0

アプリケーション環境自体にデータベース構成を注入することで、@Value アノテーションを使用できます。

これは古い質問であることは知っていますが、正確な解決策は見つかりませんでした。したがって、ここに文書化します。

私はすでに別のフォーラムで同じことを答えています。

問題の正確な解決策については、この回答を参照してください。

于 2020-05-14T09:17:20.507 に答える