@Aspect는 애스펙트라는 표식이지 컴포넌트 스캔이 아니다. 따라서 AOP를 사용하려면 스프링 빈으로 등록해야한다.
스프링 빈으로 등록하는 방법은 다음과 같다.
- @Bean 을 사용해서 직접 등록
- @Component 컴포넌트 스캔을 사용해서 자동 등록
- @Import 주로 설정 파일을 추가할 때 사용( @Configuration )
@Import 는 주로 설정 파일을 추가할 때 사용하지만, 이 기능으로 스프링 빈도 등록할 수 있다.
package com.example.demo.order.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Slf4j
@Aspect
public class AspectV1 {
@Around("execution(* com.example.demo ..*(..)) ")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{
log.info("[log] {}",joinPoint.getSignature()); // join point 시그니처
return joinPoint.proceed();
}
}
기존의 @Aspect를 사용할때는 위와 같이 @Around만 사용했지만, @Pointcut도 같이 사용 가능하다.
package com.example.demo.order.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Slf4j
@Aspect
public class AspectV2 {
//패키지와 하위 패키지
@Pointcut("execution(* com.example.demo ..*(..)) ")
private void allOrder(){} //pointcut signature
@Around("allOrder()")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{
log.info("[log] {}",joinPoint.getSignature()); // join point 시그니처
return joinPoint.proceed();
}
}
@Pointcut
@Pointcut에 포인트컷 표현식을 사용한다.
메서드 이름과 파라미터를 합쳐서 포인트컷 시그니처(signature)라 한다.
메서드의 반환 타입은 void여야 한다.
코드 내용은비워둔다.
@Around 어드바이스에서는 포인트컷을 직접 지정해도 되지만, 포인트컷 시그니처를 사용해도 된다. 여기서는
@Around("allORder()")를 사용한다.
private, public 같은 접근제어자는 내부에서만 사용하면 private를 사용해도 되지만, 다른 애스팩트에서 참고하려면 public을 사용해야한다.
결과적으로 AspectV1과 같은 기능을 수행하지만, 이렇게 분리하면 하나의 포인트컷 표현식을 여러 어드바이스에서 함께 사용할 수 있다. 또한, 다른 클래스에 있는 외부 어드바이스에서도 포인트컷을 함께 사용 할 수 있다.
'Java > 스프링 AOP' 카테고리의 다른 글
스프링 AOP - execution(1) (0) | 2023.09.12 |
---|---|
Spring AOP - 어드바이스 종류 (0) | 2023.09.11 |
Spring AOP 용어정리 (0) | 2023.09.06 |
Spring AOP - 핵심기능, 부가기능 , 애스펙트 (0) | 2023.09.05 |
@Aspect 프록시 (0) | 2023.08.31 |