2017-03-14 9 views
0

클래스의 모든 메소드와 일치하는 pointcut을 정의하려고했지만 작동하지 않았습니다. 나는 이유를 알아 내기 위해 열심히 노력했다. 그리고 결국 정의한 pointcut 표현의 오류 지점을 발견했습니다.Pointcut 표현식에서 두 개의 연속 된 별표는 무엇을 의미합니까?

다음은 내가 처음 정의한 것의 시작입니다.

내가 알고 있었던 것처럼
@Pointcut("execution(** membership.data.MemberRepository.*(..))") 

가에서 연속 두 개의 별표 "실행 (**"모든 액세스 수정 및 반환 유형을 의미합니다 (작동하지 않습니다)하지만, 그것은 반환 형식의 어떤 종류가 몇 가지 방법과 일치하지 이 같은 : 한편

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

, 그것은이 같은 다른 일치 :

public String print(String str) { ... 

을 그리고 그 다음은 내가 발견을 정의하는 적절한 방법의 시작이다이 일치합니다. 위의 두 가지 방법으로 서명하고 잘 작동합니다.

@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

두 개의'*'사이에 공백이있을 수 있습니까? – Andreas

+0

@Andreas이 두 가지 사이에 공백을 넣으려고했습니다. "실행 (* * ..") 및 포인트 컷식이있는 aspect bean을 초기화하는 동안 예외가 발생했습니다. – ParkCheolu

+0

왜 전체 pointcut을 공유하지 않습니까? 메소드 시그너처를 사용하면 의미있는 답변을 얻지 못할 것입니다. [SO에 대한 질문 방법] (http://stackoverflow.com/help/how-to-ask)을 배우고 [최소, 완전 및 검증 할 수있는 예제] (http://stackoverflow.com/help/mcve). 감사합니다. 오 그런데 : ** 모든 의미는 없습니다. 이미 말씀 드릴 수 있습니다. 문제는에 있습니다. – kriegaex

답변

0

의 전체 소스를 내 의견에 말했듯이 : 아무것도 의미하지 않는다 **, 당신 파서가 *과 동등한 것으로 파서가 해석하는 것 같지만 확실하지는 않습니다. 실제로는 구문 오류가 발생합니다. 따라서 사용하지 마십시오. 의미는 없습니다. * * blah(..)도 마찬가지입니다. 작동하지 않습니다, 그것은 잘못된 구문입니다.이 책은 "Spring in Action"책에서 수정되어야하며 거기에서도 발견되었습니다. 전체 AspectJ 문서에서 som **과 같은 형식입니다.

질문 : 클래스 membership.data.MemberRepository에 대한 모든 메소드 실행을 얻으려면 포인트 컷 execution(* membership.data.MemberRepository.*(..))을 사용하십시오. 너 혼자서 이미 알아 냈어.