Spring AOP Pointcut 표현식 - within

목차

within

within 은 특정 타입 에 대해 Advice 를 적용합니다.

특정 타입이 within 을 만족 하면 해당 타입내 모든 메소드는 Advice 가 적용됩니다.

// com.example.aop.member.MemberServiceImpl 타입을 대상으로 Advice 를 적용합니다.
within(com.example.aop.member.MemberServiceImpl)

// com.example.aop.member 패키지내 타입 이름에 Service 가 들어가면 Advice 를 적욯합니다.
within(com.example.aop.member.*Service*)

// com.example.aop 패키지와 하위 패키지내 모든 타입에 Advice 를 적용합니다.
within(com.example.aop..*)

execution 과 within 의 차이

within 은 표현식은 execution 과 다르게 부모 타입을 지정했을 경우 자식 타입에는 Advice 가 적용되지 않습니다. 즉, 상속이나 구현을 통해 생성된 객체에는 Advice 가 적용되지 않고 정확하게 지정된 타입에만 적용되는 점에서 execution 과 차이가 있습니다.

@Test
@DisplayName("타겟의 타입에만 직접 적용, 인터페이스를 선정하면 안된다.")
void withinSuperTypeFalse() {
pointcut.setExpression("within(com.example.aop.member.MemberService)");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isFalse();
}

@Test
@DisplayName("execution은 타입 기반, 인터페이스 선정 가능")
void executionSuperTypeTrue() {
pointcut.setExpression("execution(* com.example.aop.member.MemberService.*(..))");
assertThat(pointcut.matches(helloMethod, MemberServiceImpl.class)).isTrue();
}
Share