Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[스프링AOP 포인트컷] args 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

[스프링AOP 포인트컷] args

Seung__ 2022. 1. 7. 21:19
  • args : 인자가 주어진 타입의 인스턴스인 조인 포인트로 매칭
  • 기본 문법은 execution 의 args 부분과 같다.

1. execution과 args의 차이점


  • execution 은 파라미터 타입이 정확하게 매칭되어야 한다. 
  • execution 은 클래스에 선언된 정보를 기반으로 판단한다.
  • args 는 부모 타입을 허용한다. 
  • args 는 실제 넘어온 파라미터 객체 인스턴스를 보고 판단한다.

 

2. Argstest


@Slf4j
public class ArgsTest {

    Method helloMethod;

    @BeforeEach
    public void init() throws NoSuchMethodException {
        helloMethod = MemberServiceImpl.class.getMethod("hello", String.class);
    }

    private AspectJExpressionPointcut pointcut(String expression) {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(expression);
        return pointcut;
    }

    @Test
    void args(){
        //hello(String)과 매칭, 
        assertThat(pointcut("args(String)").matches(helloMethod, MemberServiceImpl.class)).isTrue();

        assertThat(pointcut("args(Object)").matches(helloMethod, MemberServiceImpl.class)).isTrue();

        assertThat(pointcut("args()").matches(helloMethod, MemberServiceImpl.class)).isFalse();

        assertThat(pointcut("args(..)").matches(helloMethod, MemberServiceImpl.class)).isTrue();

        assertThat(pointcut("args(*)").matches(helloMethod, MemberServiceImpl.class)).isTrue();

        assertThat(pointcut("args(String, ..)").matches(helloMethod, MemberServiceImpl.class)).isTrue();
    }

    /**
     * execution(* *(java.io.Serializable)) : 메서드의 시그니처로 판단(정적)
     * args(java.io.Serializable): 런타임에 전달된 인수로 판단(동적)
     */
    @Test
    void argsVsExecution() {
        //Args
        assertThat(pointcut("args(String)").matches(helloMethod, MemberServiceImpl.class)).isTrue();
        assertThat(pointcut("args(java.io.Serializable)").matches(helloMethod, MemberServiceImpl.class)).isTrue();
        assertThat(pointcut("args(Object)").matches(helloMethod, MemberServiceImpl.class)).isTrue();

        //Execution
        assertThat(pointcut("execution(* *(String))").matches(helloMethod, MemberServiceImpl.class)).isTrue();
        //매칭 실패
        assertThat(pointcut("execution(* *(java.io.Serializable))").matches(helloMethod, MemberServiceImpl.class)).isFalse();
        assertThat(pointcut("execution(* *(Object))").matches(helloMethod, MemberServiceImpl.class)).isFalse();
    }
}

 

  • pointcut() : AspectJExpressionPointcut 에 포인트컷은 한번만 지정할 수 있다. 
  • 자바가 기본으로 제공하는 String 은 Object , java.io.Serializable 의 하위 타입이다.
  • 정적으로 클래스에 선언된 정보만 보고 판단하는 execution(* *(Object)) 는 매칭에 실패한다.
  • 동적으로 실제 파라미터로 넘어온 객체 인스턴스로 판단하는 args(Object) 는 매칭에 성공한다. 
  • (부모타입 허용)

 

args 지시자는 단독으로 사용되기 보다는 뒤에서 설명할 파라미터 바인딩에서 주로 사용된다

 

 

3. GitHub: 220107 args()


 

GitHub - bsh6463/SpringAOP

Contribute to bsh6463/SpringAOP development by creating an account on GitHub.

github.com

 

Comments