1

いくつかの春のBeanファイルを宣言するプロジェクトがたくさんあります。いくつかのBean名を取得し、オブジェクトの「周囲」にいくつかの動作を追加するユーティリティを提供する「ライブラリ」を作成したいと思います(例:呼び出しカウント、監視、ロギングなど)

これを行うための明白な方法の1つは、プロジェクトのSpring xmlファイルにいくつかのAspectJアノテーションを追加することですが、「ユーティリティ」でいくつかのBeanを検索し、それらに動作を追加したいと思います(このようにして、プロジェクト自体は効用)。

ユーティリティはSpringxmlファイルのどこかで宣言されるため、ApplicationContextAwareインターフェイスを実装できるため、ApplicationContextにアクセスできますが、アプリコンテキストで別のBeanの動作をプログラムで変更する方法を模索しています。たとえば、ID「OrderService」のBeanを検索し、すべてのメソッドの周りに監視/呼び出しカウントなどを使用してアスペクト化されたBeanを作成し、「OrderService」のアプリケーションコンテキストでそのBeanを置き換えます。

このアプローチには不利な点があることは知っていますが、私が求めているのは「これを行うことは可能ですか?もしそうならどのように?」です。

4

2 に答える 2

2

AOP を使用したくない場合は、BeanPostProcessorを使用してこれを実現できます。Spring のドキュメントには次のように記載されています。

BeanPostProcessor インターフェースは、独自の (またはコンテナーのデフォルトをオーバーライドする) インスタンス化ロジック、依存関係解決ロジックなどを提供するために実装できるコールバック メソッドを定義します。Spring コンテナーが Bean のインスタンス化、構成、その他の初期化を完了した後にカスタム ロジックを実装する場合は、1 つ以上の BeanPostProcessor 実装をプラグインできます。

したがって、BeanPostProcessor を作成して登録し、メソッドを実装して、postProcessAfterInitialization(Object bean, String beanName)カスタマイズしたいメソッドを変更できます。ここにがあります。

(しかし、これは AOP の古典的な使用例であり、はるかに簡単で宣言的であるため、AOP でこれを行うことをお勧めします。bean() pointcutを使用すると、特定のパターンに一致する名前を持つ Bean にアドバイスすることもできます。)

于 2012-08-29T14:15:29.663 に答える
1

独自のBeanPostProcessorを作成できます。2 つ宣言するだけでapplicationContext.xml、Bean の初期化中に各 Bean に対して呼び出されます (実際には、直前または直後)。各呼び出しで、実際のオブジェクトとその名前を取得します。そこでは、たとえば、その名前またはタイプに応じてそのオブジェクトをラップできます。

于 2012-08-29T14:15:29.433 に答える