블로그 내 검색

2012. 3. 1.

스프링 AOP의 지시자 this와 target

스프링 AOP에서 포인트컷 표현식 지시자 문법 중 this와  target이 혼동이 올 때가 있습니다.
(저만 그럴지도;)

둘다 하나의 타입을 지정하는 방식이지만 동작은 다소 차이가 존재합니다. 두개의 큰 차이이자 확실한 구분점은 타겟과 프록시의 기준입니다.


  • this는 프록시 빈 자체의 타입으로 적용될 타겟을 선별
  • target은 타겟의 타입으로 적용될 타겟을 선별


예제를 봅시다.
아래와 같은 인터페이스와 클래스가 있다고 가정합니다.
package me.javarouka;
public static interface World {}

package me.javarouka; 
public static class Hello implements World {}
이 경우 this의 포인트컷
@Pointcut("this(me.javarouka.Hello)")
public void detectThis1(){}
은 Hello에 어드바이스를 하지 못합니다. 프록시 빈은 Hello 타입이 아니기 때문입니다. 인터페이스만 같을 뿐, 서로의 타입은 전혀 다릅니다.

프록시 빈의 타입은 World입니다. 그렇다면,
@Pointcut("this(me.javarouka.World)")
public void detectThis1(){}
로 지정해야 합니다.
이 경우에는 프록시는 World 타입이며, 적용됩니다.
주의할 점은 AOP 설정에서 proxy-target-class 등으로 인터페이스가 아닌 타겟에 대해 프록시를 생성하게 해 두었다면 위의 detectThis1 포인트컷도 적용됩니다. 주의하세요.

반면 target 지시자는 다릅니다. 타겟의 타입으로 포인트컷을 선별합니다.
타겟이 중심이 되며, 타겟 자체의 타입이 기준이 됩니다.
그래서 아래의 포인트컷 둘다 Hello 에 적용됩니다.
@Pointcut("target(me.javarouka.Hello)")
public void detectTarget1(){}

@Pointcut("target(me.javarouka.World)")
public void detectTarget2(){}

댓글 없음:

댓글 쓰기