Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- Spring Boot
- SpringBoot
- JPQL
- 스프링 핵심 원리
- springdatajpa
- pointcut
- spring
- Proxy
- QueryDSL
- AOP
- http
- 김영한
- 인프런
- Thymeleaf
- jpa
- transaction
- Android
- java
- 자바
- Exception
- 스프링 핵심 기능
- 스프링
- 그리디
- db
- kotlin
- Servlet
- Greedy
- JDBC
- 백준
Archives
- Today
- Total
개발자되기 프로젝트
[스프링AOP 포인트컷] execution - 2 본문
1. 타입 매칭 - 부모 타입 허용
@Test
void typeExactMatch(){
pointcut.setExpression("execution(* hello.aop.member.MemberServiceImpl.*(..))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
@Test
void typeMatchSuperType(){
pointcut.setExpression("execution(* hello.aop.member.MemberService.*(..))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
- typeExactMatch() 는 타입 정보가 정확하게 일치하기 때문에 매칭된다.
- typeMatchSuperType() 을 주의해서 보아야 한다.
- execution 에서는 MemberService 처럼 부모 타입을 선언해도 그 자식 타입은 매칭된다.
- 다형성에서 부모타입 = 자식타입 이 할당 가능하다는 점을 떠올려보면 된다..
2. 타입 매칭2
- 표현식에 상위 클래스를 지정한 경우 부모 타입에 있는 메서드만 허용
@Test
void typeMatchInternal() throws NoSuchMethodException {
pointcut.setExpression("execution(* hello.aop.member.MemberServiceImpl.*(..))");
Method internalMethod = MemberServiceImpl.class.getMethod("internal", String.class);
assertThat(pointcut.matches(internalMethod, MemberServiceImpl.class)).isTrue();
}
@Test //자식 타입에만 있는 다른 메서드도 매칭 가능??
void typeMatchNoSuperTypeMethodFalse() throws NoSuchMethodException {
pointcut.setExpression("execution(* hello.aop.member.MemberService.*(..))");
Method internalMethod = MemberServiceImpl.class.getMethod("internal", String.class);
assertThat(pointcut.matches(internalMethod, MemberServiceImpl.class)).isFalse();
}
- typeMatchInternal() 의 경우 MemberServiceImpl 를 표현식에 선언했기 때문에 그 안에 있는
internal(String) 메서드도 매칭 대상이 된다. - typeMatchNoSuperTypeMethodFalse() 를 주의해서 보아야 한다.
- 이 경우 표현식에 부모 타입인 MemberService 를 선언했다.
- 그런데 자식 타입인 MemberServiceImpl 의 internal(String) 메서드를 매칭하려 한다.
- 이 경우 매칭에 실패한다. MemberService 에는 internal(String) 메서드가 없다!
- 부모 타입을 표현식에 선언한 경우 부모 타입에서 선언한 메서드가 자식 타입에 있어야 매칭에 성공한다.
- 그래서 부모 타입에 있는 hello(String) 메서드는 매칭에 성공하지만,
- 부모 타입에 없는 internal(String) 는 매칭에 실패한다.
3. 파라미터 매칭
//String 타입의 파라미터 허용
//(String)
@Test
void argsMatch(){
pointcut.setExpression("execution(* *(String))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
//파라미터 없음
//()
@Test
void argsMatchNoArgs(){
pointcut.setExpression("execution(* *())");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isFalse();
}
//정확히 하나의 파라미터 허용, 모튼 타입 허용
// (xxx)
@Test
void argsMatchStar(){
pointcut.setExpression("execution(* *(*))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
//숫자와 무관하게 모튼 파라미터, 모든 타입
// (), (Xxx), (Xxx, Xxx)
@Test
void argsMatchAll(){
pointcut.setExpression("execution(* *(..))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
//String 타입으로 시작, 숫자와 무관하게 모튼 파라미터, 모든 타입
// (String), (String, Xxx), (String, Xxx, Xxx)
@Test
void argsMatchComplex(){
pointcut.setExpression("execution(* *(String, ..))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
- (String) : 정확하게 String 타입 파라미터
- () : 파라미터가 없어야 한다.
- (*) : 정확히 하나의 파라미터, 단 모든 타입을 허용한다.
- (*, *) : 정확히 두 개의 파라미터, 단 모든 타입을 허용한다.
- (..) : 숫자와 무관하게 모든 파라미터, 모든 타입을 허용한다. 참고로 파라미터가 없어도 된다. 0..* 로
이해하면 된다. - (String, ..) : String 타입으로 시작해야 한다. 숫자와 무관하게 모든 파라미터, 모든 타입을 허용한다.
예) (String) , (String, Xxx) , (String, Xxx, Xxx) 허용
4. GitHub: 220106 execution 2
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
[스프링AOP 포인트컷] args (0) | 2022.01.07 |
---|---|
[스프링AOP 포인트컷] within (0) | 2022.01.06 |
[스프링AOP 포인트컷] execution - 1 (0) | 2022.01.06 |
[스프링AOP 포인트컷] 예제코드 (0) | 2022.01.05 |
[스프링AOP 포인트컷] Pointcut 지시자 (0) | 2022.01.05 |
Comments