(0)

사용할 예제 코드

package spring.pack;

public interface TargetInterface {

    void hello();

    void hello(String a);

    int minus(int a, int b);

    int plus(int a, int b);
}
package spring.pack;

public class Target implements TargetInterface {

    @Override
    public void hello() {}

    @Override
    public void hello(String a) {}

    @Override
    public int minus(int a, int b) { return 0; }

    @Override
    public int plus(int a, int b) { return 0; }

    public void method() {}
}
package spring.pack;

public class Bean {

    public void method() throws RuntimeException {}
}

 

(1)

만약 Target 클래스의 hello(String a) 메서드를 지정하고 싶다면 다음과같이 표현식을 작성하면 된다.

괄호 안의 내용을 딱 보면 뭔지 알것같을 것이다. 메소드 시그니처.

execution(public void spring.pack.Target.hello(String a))

 

(2)

접근제한자는 생략할 수 있다. 생략이 가능하다는 건 이 항목에 대해서는 조건을 부여하지 않는다는 의미다.

 

execution(void spring.pack.Target.hello(String a))

 

 

(3)

리턴타입은 생략할 수 없다. 모든 리턴타입에 대해 상관 없게 하고싶으면 에스터리스크(*)을 사용하면 된다.

execution(public * spring.pack.Target.hello(String a))
execution(* spring.pack.Target.hello(String a))

 

(4)

spring.pack.Target. 이 부분은 생략 가능하다. 생략하면 모든 패키지의 모든 클래스에 대해 허용하겠다는 뜻이다.

execution(* hello(String a))

 

(5)

메서드 이름은 생략할 수 없다. Target 클래스의 모든 메서드를 포인트컷으로 지정하고 싶으면 다음과 같이 쓰면 된다.

execution(* spring.pack.Target.*(String a))

 

 

 

다음과 같이 메서드 이름 일부를 가지고도 지정 가능하다.

execution(* spring.pack.Target.*llo(String a))

 

 

 

(6)

메서드의 파라미터가 갯수도, 타입도 상관 없다면 다음과 같이 쩜쩜(..) 을 쓰면 된다.

execution(* spring.pack.Target.m*(..))

 

파라미터 갯수는 상관 있는데 타입은 상관 없다면 다음과 같이 쓴다.

(타입이 상관 없는 파라미터에 * 표시)

execution(* spring.pack.Target.minus(*,*))

 

(7)

클래스 부분을 좀 더 자세히 살펴보자 (spring.pack.Target 이부분)

spring.pack 패키지에 있는 모든 클래스에 있는 minus 메서드에 대해 지정하고싶으면 다음과 같이 쓴다.

execution(* spring.pack.*.minus(*,*))

 

spring 패키지 하위 어딘가에 있는 Target 클래스의 minus 메서드에 대해 지정하고싶으면 다음과 같이 쓴다.

".."은 모든 하위 패키지를 의미한다.

execution(* spring..Target.minus(*,*))

 

 

그런데 맨 처음 패키지와 맨 마지막의 클래스이름(타입이름)은 ".." 을 이용해서 축약할 수 없다.

그러므로 맨 처음 패키지를 모든 패키지로 하고싶거나, 클래스를 모든 클래스로 하고싶으면 그 자리에 에스터리스크(*)을 쓰면 된다.

아래 두 표현은 같은 의미이다.

execution(* *..*.minus(*,*))

 

execution(* minus(*,*))

 

(8)

다음과 같이 작성하면, TargetInterface 에 정의되어있는 메소드만 포인트컷으로 적용된다. 따라서 TargetInterface 에는 없는 메서드인 public void spring.package.Target.method() 는 제외된다.

execution(* *..TargetInterface.*(..))

 

(9)

execution() 은 메소드의 시그니처를 비교하는 방식이다. 이 외에도 몇 가지 표현식 스타일들이 있다.

예를들면 스프링에서 사용될 때 Bean 의 이름으로 비교하는 bean() 이 있다. bean(*Service)라고 쓰면 이름이 Service로 끝나는 모든 빈을 선택한다.

+ Recent posts