2010-11-18 7 views
3

非プロキシオブジェクトからメソッドをインターセプトしたい。springとaspectj、非代理オブジェクトのインターセプトメソッド

私はクラスインスタンスMyClass myClassInstance=new MyClass()を持っており、私はmyClassInstanceメソッドの呼び出しを傍受したいと思います。

私はすべてのプロキシで良い作品を知っていますが、私はプロキシではないという側面が必要です。

これは可能ですか?

ありがとうございました。

答えて

5

可能ですが、望ましくありません。

@Configurableを使用すると、AspectJはコールを代行受信します。それについてthe 7.8.1 Using AspectJ to dependency inject domain objects with Spring section of the docsを読んでください。

簡潔に言えば、AspectJはコンパイル時またはロード時(それぞれのウィーバーを含む)のいくつかの「魔法」をプラグインします。これにより、クラスがスプリングコンテキストの一部になるように変更されます。

私がそれが望ましくない理由として、これはクラスの構造を変更することによって起こる暗い魔法です。これはオブジェクト指向のアプローチではなく、サポートすることは難しいと思います。 6ヶ月後にあなたの同僚が厄介な問題をデバッグしていると想像してください。この魔法が起こっていることを彼が理解するまでに数日かかるかもしれません。しかし、この意見は服従です。機能があり、それが必要な場合は使用してください。

+0

@Bozho:私は@ConfigurableでMyClassの注釈を付けたが、何も傍受されません。 – blow

+0

@blowを追加する必要があります。 のように、私が言ったように、ドキュメントのセクションを読んでください。私が思い出す限り、aspectjコンパイラ、またはaspectJ JVMエージェントのいずれかが必要です – Bozho

+0

@Bozho:私はあなたの編集を読むので、これは私のための解決策ではないと思います。私は自分のエンティティのメソッドの呼び出しを傍受し、遅延コレクションのロードのためにセッションを管理したがっていました。これは私が考える正しい解決策ではありません。 – blow

1

春を使用して、私はそう信じていません(I appear to be wrong)、AspectJを使用して私はあなたができる限り、あなたができると信じてcompile all the code with the AspectJ compiler。しかし、私はそれを試みたことはありません。

+0

私はSpring 3.0をaspectJコンパイル時の織りと一緒に使用し、うまく機能しました。プロキシアプローチよりもはるかに優れています。 – Ralph

0

Springでロード時間織りを有効にすることができます。そして、クラスローダは、ロードされたときにクラスに定義されているすべてのアスペクトを、Springによって作成されているかどうかに関係なく織り込みます。

あなたのコンテキストファイルに次の行を追加することでLTWを有効にする必要があります:

参照: http://static.springsource.org/spring/docs/3.0.0.M4/spring-framework-reference/html/ch07s08.html#aop-aj-ltw

関連する問題