before : advice 대상 메서드가 호출되기 전에 advice 기능을 수행
after : 결과에 상관없이 advice 대상 메서드가 완료된 후에 advice 기능을 수행
after-returning : advice 대상 메서드가 성공적으로 완료된 후에 advice 기능을 수행
after-throwing : advice 대상 메서드가 완료되기 전에 throwing이 반환되었을 경우 기능을 수행
PointCut : advice의 경로를 간략하게 만들 수 있다( 어떤 메소드가 AOP 어드바이스의 대상이 되는지를 선택)
Around : 위의 advice의 내용들을 하나로 묶을 수 있다 (조인 포인트를 완전히 대체하거나 변경할 수 있는 가장 강력한 유형의 어드바이스)
//perform 메서드를 수행하기 전에, 이것부터 수행된다.
@Before("execution(* com.seomoon.concert.Perfomance.perform(..))")
public void silencedCellPhone() {
System.out.println("Silencing cellphone");
}
@Before("execution(* com.seomoon.concert.Perfomance.perform(..))")
public void takeSeats() {
System.out.println("Taking seats");
}
//동일한 시기의 어드바이스가 두가지 일 경우, 순서를 보장할 수는 없다.
//order 어드바이스를 통해 순서를 고정적으로 처리할 수 있다.
//공연이 성공적으로 끝난 후
@AfterReturning("execution(* com.seomoon.concert.Perfomance.perform(..))")
public void applause() {
System.out.println("CLAP CLAP CLAP!!!");
}
//공연이 성공적으로 끝나지 못하고 Throwing을 반환했을 때
@AfterThrowing("execution(* com.seomoon.concert.Perfomance.perform(..))")
public void demandRefund() {
System.out.println("Demanding a refund");
}
//Pointcut을 통해 경로 간략화 ex) @Before("performance()")
@Pointcut("execution(* com.seomoon.concert.Perfomance.perform(..))")
public void performance() {}
//Around를 통해 위의 내용들을 하나로 만듬.
@Around("performance()")
public void WatchPerformance(ProceedingJoinPoint jp) {
try {
System.out.println("Silencing cellphone");
System.out.println("Taking seats");
jp.proceed();
System.out.println("CLAP CLAP CLAP!!!");
} catch (Throwable e) {
System.out.println("Demanding a refund");
}
}