

名前付きポイントカットを記述するとき、以下のような書式が説明されていました。

ここで、`()` の中に引数を書いたり、`{}` の中に具体的な処理を書いたりすることはできるのでしょうか。  
いろいろ調べたのですが、いずれも以下のような書式しか説明が見当たりませんでした。

[code]

    @Pointcut("execution(* * *.*test.*(..))")
    public void myTest() {}
    
[/code]

見落としもあると思いますので、どちらかに説明があればその場所を教えて頂けないでしょうか。  
よろしくお願いします。


CC BY-SA 4.0
2021-11-09T00:56:11.897
83501
2021-11-09T04:13:23.740
2021-11-09T02:03:39.050
3060
48998
question
java spring
AOPの名前付きポイントカット式の記述方法について


`public void myTest() {}`の`()` の中に引数を書いたり、`{}`
の中に具体的な処理を書いたりすることができるかという質問ですね。そうでしたら、引数とメソッドの処理のどちらも、特定のポイントカット式を記述した場合のみ書くことができる、というのが答えになります。

この部分は（Springフレームワークを使っていても）AspectJというライブラリが処理しており、そのドキュメントに説明があります。  
<https://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj-
pcadvice.html>

まずメソッド引数について書きます。上記webページから抜粋します。

> The parameters of the method correspond to the parameters of the pointcut.

訳: メソッド引数はポイントカットの引数と一致する。

言い換えますと、ポイントカット式に引数を書けばメソッドにも同じ引数を書きます。  
上記webページに例があります。

[code]

     @Pointcut("call(* *.*(int)) && args(i) && target(callee)")
     void anyCall(int i, Foo callee) {}
    
[/code]

まず、`args()`で引数`i`を書いているので、メソッド引数に`int
i`を書いています。`args()`のような引数指定だけではなく、`target()`で呼び出された側のオブジェクトに対して`callee`という名前をつけて利用しようとしているため、メソッド引数に`Foo
callee`を定義しています。他に`this()`もあり、このような場合にメソッド引数を書きます。

次にメソッドボディについてです。先ほどのページから抜粋します。

> As a general rule, the @Pointcut annotated method must have an empty method
> body and must not have any throws clause.

訳: 原則として、@Pointcutを付与したメソッドはメソッドボディが空でなければならず、あらゆるthrows句を持つことができない。  
よって通常メソッドボディに処理を書くことはできません。

ただし、`if()`というものがあり、これを使うときのみメソッドボディに処理を書きます。また抜粋します。

[code]

     @Pointcut("call(* *.*(int)) && args(i) && if()")
     public static boolean someCallWithIfTest(int i) {
        return i > 0;
     }
    
[/code]

メソッドボディに`if()`の条件分岐処理を書きます。処理が書けるのはこのケースのみです。


CC BY-SA 4.0
2021-11-09T04:13:23.740
83509
2021-11-09T04:13:23.740
4464
83501
answer