본문 바로가기

스프링 프레임워크

PointCut 표현식 문법

# PointCut 표현식 문법

- AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용하여 작성한다.

- 포인트컷 지시자 중에서 가장 대표적으로 사용되는 것은 execution() 이다.

- execution() 지시자를 사용한 포인트컷 표현식의 문법구조는 다음과 같다.

 

execution([접근제한자 패턴] 타입패턴[타입패턴.] 이름패턴(타입패턴 | "..", ...) [throws 예외패턴])

 

1) [접근제한자 패턴] : public, private 와 같은 접근제한자, 생략가능

2) 타입패턴[타입패턴.] : 리턴값의 타입 패턴

3) 이름패턴(타입패턴 | "..", ...) : 메서드 이름 타입패턴, 파라미터의 타입 패턴을 순서대로 넣을 수 있다.   

                                        와일드카드를 이용해 파라미터 개수에 상관없는 패턴을 만들 수 있다.

4) throws 예외패턴 : 예외이름패턴

 

ex. PointCut 표현식 예시 

execution(* aspect.trace.demo.*.*(..))

1) * : any return type

2) aspect.trace.demo : package

3) * : class

4) * : method

5) (..) : any type and number of arguments

 

ex1. execution(* hello(..))

           => hello 라는 이름을 가진 메서드를 선정하는 것이다. 파라미터는 모든 종류를 다 허용한다.

 

ex2. execution(* hello)

           => 파라미터 패턴이 ()로 되어있으니 hello 메서드 중에서 파라미터가 없는 것만 선택한다.

 

ex3. execution(* myspring.user.service.UserServiceImpl.*(..))

           => myspring.user.service.UserServiceImp 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를        

                     선택한다.

 

ex4. execution(* myspring.user.service.*.*(..))

           => myspring.user.service 패키지의 모든 클래스에 적용된다.

                     하지만 서브패키지의 클래스는 포함되지 않는다.

 

ex5. execution(* myspring.user.service..*.*(..))

           => myspring.user.service 패키지의 모든 클래스에 적용된다.

                     그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함된다.

 

ex6. execution(* *..Target.*(..))

           => 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용된다.

                     다른 패키지에 같이 이름의 클래스가 있어도 적용이 된다는 점에 유의해야함

 

 

 

출처: www.youtube.com/watch?v=eLJBXb9QO4o&list=PL9mhQYIlKEhfYqQ-UkO2pe2suSx9IoFT2&index=16