2011-02-10 1 views
4

기본 인터페이스에서 확장 된 서비스 레이어 인터페이스가 있습니다. 내 Service-Layer Interface를 중심으로 Pointcut을 만들고 싶지만 기본 Interface에 정의 된 메소드 중 하나를 사용하고 싶습니다.인터페이스에서 애스펙트를 만드는 방법 "수퍼"인터페이스에서 확장하는 방법

예를 들어, 기본 인터페이스에 "save()"라는 메서드가 있는데, 내 모든 "자식"인터페이스가 "저장"기능을 제공하기 때문에 기본 인터페이스에 넣습니다.

내 "저장"이 호출 될 때 내 "하위"인터페이스 중 하나에서만 PointCut을 만들고 싶습니다.

내가 좋아하는 포인트 컷을 만든 다음 :

@Pointcut("execution(* com.xyz.someapp.ChildServiceInterface.save(..))") 
public void childServiceSavePointCut(); 

나는 다음과 같은 위의 포인트 컷 주위에 @Around 조언을 만든 :

"ChildServiceInterface는"있는 다른 인터페이스를 확장
@Around("childServiceSavePointCut()") 
public void doMyAdvice().... 

"save()"메소드가 정의되었습니다.

내 조언은 절대 실행되지 않습니다 ... 내 코드를 디버깅했으며 목표 서비스에 대한 조언자 목록에 내 조언이 표시되지 않습니다.

나는이 방법이 정상적으로 작동하는지 생각하지 않습니까? 아니면 잘못 구현하고 있습니까?

답변

9

대신이 pointcut을 시도하십시오.

within(com.xyz.someapp.ChildServiceInterface+) && execution(* save(..)) 

+

subtype pattern 나타냅니다.

1

아니면

@Pointcut("execution(* com.xyz.someapp.ChildServiceInterface.*(..))") 
public void childServiceSavePointCut(); 

* 사용하여 해당 클래스의 모든 메소드에 포인트 컷 넣을 수 있습니다 모든 방법의 유형을 나타냅니다.