1

私は春にAOPを実際の問題なく使用しましたが、主にトランザクション管理に使用されており、魅力的です。

私の質問はこれです...これまでに私が見た AOP の唯一の例は、自分で作成したクラスをポイントカットすることです。データベース接続クラスなど、サードパーティ ライブラリ内のクラスをポイントカットすることは可能ですか。コンテキストは、いくつかのログを作成し、Oracle データ ソースがデータベースへの呼び出しを実行したときに情報を収集したいということです。残念ながら、これは Oracle クラス ファイルのスタックに含まれています。SQL が実行されたときに、このクラス/メソッドをどのようにポイントカットしますか?

4

1 に答える 1

2

私はこれがうまくいくと思います:

  1. Spring に DataSource の初期化を任せる
  2. DataSource の getConnection() メソッドに対してアスペクトを適用する
  3. あなたのアドバイスでは、返された接続を新しいクラス(「LoggingConnection」)でラップします。これは、接続を実装し、すべてのメソッドを「実際の」ラップされた接続に委譲します(これはデコレーターパターンだと思います)
  4. 必要なロギング コードを「LoggingConnection」クラスに追加します。

このアプローチでは、元の DataSource のプロキシが作成され、メソッド呼び出しごとに委任されることに注意してください。データベース操作のコンテキストでは、これによって多くの追加のオーバーヘッドが発生することはありません。コードが例外をスローして Connections が適切に動作するのを妨げないように、コードの実行には細心の注意を払う必要があります。おそらく、try/catch/finally を使用して、「実際の」接続にデリゲートする呼び出しを finally ブロックに入れます。

もう 1 つのまったく異なるアプローチは、AspectJ を使用して読み込み時間のウィービングを行うことです。そうすれば、ClassLoader がクラスをロードするとすぐに、クラスを新しい機能で装飾できます。

于 2009-01-30T16:54:41.407 に答える