2017-03-14 10 views
0

クラス内のすべてのメソッドと一致するポイントカットを定義しようとしましたが、機能しませんでした。 私はなぜその理由が分かりましたか。 そして私は最終的に私が定義したポイントカット式の障害点を発見しました。ポイントカット式の2つのアスタリスクは何を意味しますか?

以下は、私が最初に定義したものの始まりです。私は、連続した2つのアスタリスクを知っていたように、「**(実行」任意のアクセス修飾子と任意の戻り値の型を意味するが、それは、戻り値の型のいくつかの種類を持っているいくつかのメソッドにマッチしたことはありませんで

@Pointcut("execution(** membership.data.MemberRepository.*(..))") 

を(動作しません)このように:一方

public List<MemberVO> findByName(String name) { ... 

、それはこのように、別の一致:

public String print(String str) { ... 

、次は私が見つけたそれを定義する適切な方法の初めであるこれらのマッチ。上記の2つのメソッドシグネチャとうまく動作します。

@Pointcut("execution(public * membership.data.MemberRepository.*(..))") 

@Pointcut("execution(* membership.data.MemberRepository.*(..))") 

私には何が欠けていましたか?私は答えを見つけようと努力したが、決して現れなかった。 私は「実行(**」の正確な意味を教えてください

追加:アスペクトクラスの完全なソース

@Aspect 
public class PerformanceLogger { 

    @Pointcut("execution(* membership.data.MemberRepository.*(..))") 
    public void performance() {} 

    @Around("performance()") 
    public Object watchPerformance(ProceedingJoinPoint jp) { 
     try { 
      long st = System.nanoTime(); 
      Object obj = jp.proceed(); 
      System.out.println(jp.toShortString() + " called :" + (System.nanoTime() - st)); 
      return obj; 
     } catch (Throwable e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+0

おそらく2つの '*'の間にスペースがありますか? – Andreas

+0

@Andreas私は、このように2つの間にスペースを入れようとしました: "実行(* * .."とポイントカット式を持つアスペクトビーンを初期化している間に例外が発生しました – ParkCheolu

+0

なぜ完全なポイントカットを共有しませんか?メソッドのシグネチャを使用すると、意味のある回答は得られません。[SOの質問方法](http://stackoverflow.com/help/how-to-ask)を参照し、[最小、完全、およびああ、ちなみに: '**'は全く意味がありません。私はすでにあなたに伝えています。あなたの問題は以下の通りです。 – kriegaex

答えて

0

私は私のコメントで言ったように:**は何の意味もありません、あなたは幸運にもパーサーは*と同等のものと解釈しているようですが、確かにわかりませんが、実際には構文エラーが生じるはずですので、意味がありません。 IMOは "Spring in Action"という本で修正する必要がありますが、私はそこにもありました。AspectJのドキュメント全体では、somを見つけることはできません**のようなものです。

ご質問:クラスmembership.data.MemberRepositoryのすべてのメソッド実行を取得するには、ポイントカットexecution(* membership.data.MemberRepository.*(..))を使用してください。あなたはすでに自分で見つけました。

関連する問題