포인트컷은 관심 조인 포인트를 결정하므로 어드바이스가 실행되는 시기를 제어할 수 있음
AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공
@Pointcut("execution(* 패키지명..*(..))")
private void anyOldTransfer() {}
execution의 빈도가 매우 높고 나머지는 자주 사용하지 않음
종류 | 설명 |
---|---|
execution | 메서드 실행 조인트 포인트를 매칭하며 스프링 AOP에서 가장 많이 사용하며 기능도 복잡 |
within | 특정 타입 내의 조인 포인트를 매칭 |
args | 인자가 주어진 타입의 인스턴스인 조인 포인트 |
this | 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 |
target | Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 |
@target | 실행 객체의 클래스에 주어진 타입의 애너테이션이 있는 조인 포인트 |
@within | 주어진 애너테이션이 있는 타입 내 조인 포인트 |
@annotation | 메서드가 주어니 애너테이션을 가지고 있는 조인 포인트를 매칭 |
@args | 전달된 실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 갖는 조인 포인트 |
bean | 스프링 전용 포인트컷 지시자이고 빈의 이름으로 포인트컷을 지정 |
포인트컷 표현식은 &&, ||, !
를 사용하여 결합할 수 있음
@Pointcut("execution(public * *(...))")
private void anyPublicOperation() {}
@Pointcut("within(패키지명..*)")
private void inTrading() {}
@Pointcut("anyPulbicOperation() && inTrading()")
private void tradingOperation() {}
anyPublicOperation
는 메서드 실행 조인 포인트가 공용 메서드의 실행을 나타내는 경우 일치
inTrading
는 메서드 실행이 거래 모듈에 있는 경우에 일치
tradingOperation
는 메서드 실행이 거래 모듈의 공개 메서드를 나타내는 경우 일치
`execution(public * *(..))`
`execution(* 패키지명.service.AccountService.*(..))`
`execution(* 패키지명.service.AccountService.*(..))`
`execution(* 패키지명.service.*.*(..))`
`execution(* 패키지명.serviece..*.*(..))`
within(패키지명.service *)
within(패키지명.service..*)
this(패키지명.service.AccountService)
target(패키지명.service.AccountService)
args(java.io.Serializable)
@target(org.springframework.transaction.annotation.Transactional)
@annotation(org.springframework.transaction.annotation.Transactional)
@args(패키지명.security.Classified)
bean(tradeService)
bean(*Service)