728x90
AspectJ는 포인트 컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다
포인트 컷 표현식은 AspectJ pointcut expression 즉 AspectJ가 제공하는 포인트 컷 표현식을 줄여서 말하는 것이다.
포인트 컷 지시자
포인트컷포인트 컷 표현식은 execution 같은 포인트 컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다
포인트 컷 지시자의 종류
- execution : 메서드 실행 조인 포인트를 매칭 한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다.
- within : 특정 타입 내의 조인 포인트를 매칭한다.
- args : 인자가 주어진 타입의 인스턴스인 조인 포인트
- this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
- target : Target 객체(스프링 AOP 프록시가 가리키는 실제 대상)를 대상으로 하는 조인 포인트
- @target : 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트
- @within : 주어진 애노테이션이 있는 타입 내 조인 포인트
- @annotation : 메서드가 주어진 애노테이션을 가지고 있는 조인 포인트를 매칭
- @args : 전달된 실제 인수의 런타임 타입이 주어진 타입의 애노테이션을 갖는 조인 포인트
- bean : 스프링 전용 포인트컷 지시자, 빈의 이름으로 포인트 컷을 지정한다.
execution 은 가장 많이 사용하고, 나머지는 자주 사용하지 않는다. 따라서 execution을 중점적으로 이해하자
예제 만들기
ClassAop 어노테이션 작성
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAop {
}
MethodAop 어노테이션 작성
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAop {
String value();
}
MemberService 인터페이스 작성
public interface MemberService {
String hello(String param);
}
MemberServiceimpl 구현체 작성
@ClassAop
@Component
public class MemberServiceImpl implements MemberService{
@Override
@MethodAop("test value")
public String hello(String param) {
return "ok";
}
public String internal(String param){
return "ok";
}
}
Test
@Slf4j
public class ExecutionTest {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
Method helloMethod;
@BeforeEach
public void init() throws NoSuchMethodException {
helloMethod = MemberServiceImpl.class.getMethod("hello", String.class);
}
@Test
public void helloMethod() throws Exception{
//public java.lang.String hello.aop.order.member.MemberServiceImpl.hello(java.lang.String)
log.info("helloMethod={}", helloMethod);
}
}
- AspectJExpressionPointcut 이 바로 포인트컷포인트 컷 표현식을 처리해주는 클래스다. 여기에 포인트 컷 표현식을 지정하면 된다. AspectJExpressionPointcut는 상위에 Pointcut 인터페이스를 가진다.
- printMethod() 테스트는 MemberServiceImpl.hello(String) 메서드의 정보를 출력해준다.
728x90
'스프링 핵심 원리(고급편)' 카테고리의 다른 글
| Ch11. 스프링 AOP(포인트컷) - within, args (0) | 2022.04.20 |
|---|---|
| Ch11. 스프링 AOP(포인트컷) - execution (0) | 2022.04.20 |
| Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(어드바이스 종류) (0) | 2022.04.19 |
| Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(어드바이스 순서) (0) | 2022.04.19 |
| Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(포인트컷 참조) (0) | 2022.04.19 |