AspectJ는 AOP를 제대로 사용하기 위해 꼭 필요한 라이브러리
springboot에 기본적으로 포함되어 있어서 따로 라이브러리를 추가해 줄 필요는 없다.
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{
}
이렇게 하면 하나의 Aspect가 생성된다.
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{
@Pointcut("excution(= transfer(..))")
private void anyOldTransfer() {}
}
"excution(= transfer(..))"
이런식으로 조건을 생성해서 넣어준다.
포인트 컷 표현식이라고 부름.
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{
@Pointcut("excution(public * *(...))")
private void anypublicOperation() {} // public 대상 메서드 pointcut
@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading(){} //특정 패키지 대상 포인트 컷
@Pointcut("anyPublicOperation() && inTrading()")
public void tradingOpertion() {} //위의 두조건을 and 조건으로 결합한 포인트 컷
}
@Aspect
public class BeforeExample{
@Before("com.xyz.myapp.CommonPointcuts.dataAcessOperation()")
public void doAcessCheck(){
}
}
dataAcessOperation() 이라는 메서드가 실행되기 바로 전에 doAcessCheck()가 실행된다.
@Aspect
public class AfterReturningExample{
@AfterReturning("com.xyz.myapp.CommonPointcuts.dataAccessOpearation()")
public void doAcesscheck(){
}
}
dataAcessOperation() 라는 메서드가 실행된후 doAcessCheck()가 실행된다.
businessService{}라는 포인트 컷의 전과후에 동작을 추가한다.
public class AroundExample{
@Around("com.xyz.myapp.CommonPointcut.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
//start stopwatch
Object retVal = pjp.proceed();
//stop stopwatch
return retVal;
}
}