//@target: 인스턴스 기준으로 모든 메서드의 조인 포인트를 선정, 부모 타입의 메서드도 적용 @Around("execution(* com.example.aop..*(..)) && @target(com.example.aop.member.annotation.ClassAop)") public Object atTarget(ProceedingJoinPoint joinPoint)throws Throwable { log.info("[@target] {}", joinPoint.getSignature()); return joinPoint.proceed(); }
//@within: 선택된 클래스 내부에 있는 메서드만 조인 포인트로 선정, 부모 타입의 메서드는 적용되지 않음 @Around("execution(* com.example.aop..*(..)) && @within(com.example.aop.member.annotation.ClassAop)") public Object atWithin(ProceedingJoinPoint joinPoint)throws Throwable { log.info("[@within] {}", joinPoint.getSignature()); return joinPoint.proceed(); } }
AOP 적용 확인
@Test voidsuccess() { log.info("child Proxy={}", child.getClass()); child.childMethod(); //부모, 자식 모두 있는 메서드 child.parentMethod(); //부모 클래스만 있는 메서드 }
staticclassConfig {
@Bean public Parent parent() { returnnewParent(); } @Bean public Child child() { returnnewChild(); } @Bean public AtTargetAtWithinAspect atTargetAtWithinAspect() { returnnewAtTargetAtWithinAspect(); } }
staticclassParent { publicvoidparentMethod(){} //부모에만 있는 메서드 }