チュートリアルで次のSpringAOPポイントカットに出くわしました。
execution(public * * (..))
それはすべてのパブリックメソッドの実行を引き起こすと言われていました。あれは正しいですか?AFAIKは、パブリックメソッドのみをインターセプトでき、そのパブリックキーワードは違法ですらあります。
チュートリアルで次のSpringAOPポイントカットに出くわしました。
execution(public * * (..))
それはすべてのパブリックメソッドの実行を引き起こすと言われていました。あれは正しいですか?AFAIKは、パブリックメソッドのみをインターセプトでき、そのパブリックキーワードは違法ですらあります。
@Marioの回答に加えて、AOPの春のドキュメントには次のように書かれています(私の強調):
注SpringのAOPフレームワークのプロキシベースの性質により、保護されたメソッドは、定義上、JDKプロキシ(これが適用されない場合)でもCGLIBプロキシ(技術的には可能であるがAOPの目的では推奨されない場合)でもインターセプトされません。 。結果として、特定のポイントカットはパブリックメソッドとのみ照合されます。
インターセプトのニーズに保護/プライベートメソッドまたはコンストラクターが含まれる場合は、SpringのプロキシベースのAOPフレームワークの代わりに、Spring駆動のネイティブAspectJウィービングの使用を検討してください。これは、さまざまな特性を持つさまざまなAOP使用モードを構成するため、決定を下す前に、まず織りに慣れてください。
また、ポイントカット文法は次のとおりです。
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?
name-pattern(param-pattern) throws-pattern?)
Wherbyは、などmodifier-pattern
になりますが、オプションです...public
protected
はい、それは有効なポイントカットのようです、そしてそれは彼が言うことを正確に行います。
さらに、「public」キーワードを「protected」に置き換えることは完全に合法であり、それでも機能することに注意してください。不思議なことに、それは「プライベート」メソッドでも機能します...(Spring 3.1.2 + AspectJ 1.6.9でテスト済み)
私の知る限り、CGLibプロキシは保護されたメソッドをプロキシするために使用できますが、それらが別のオブジェクトインスタンスから呼び出された場合にのみ有効です。したがって、技術的には、保護された方法を公開されている方法とまったく同じ方法でアドバイスできるはずです。
(@ beny23によって報告されているように、保護された/プライベートなメソッドはSpring AOPプロキシの実装では機能しませんが、Spring駆動のAspectJウィービングでのみ機能します)
ポイントカット:designator(modifier returnType package.type.method(params))
あなたの場合
execution(public * * (..))
0から多くのパラメータを持つプロジェクトディレクトリ内の任意のリターンタイプのすべてのパブリックメソッドに対して実行されます