- 직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있음
- 지정하는 조건 방법에는 포인트 컷 사용
- execute(반환값 패키지.클래스.메서드(인수))
package me.yuan.bookstudy.used.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
@Aspect//어드바이스를 기술하는 클래스@Component//인스턴스 생성publicclassSampleAspect{
@Before("execution(* me.yuan.bookstudy.used.*Greet.*(..))")//메서드 실행 전에 호출publicvoidbeforeAdvice(JoinPoint joinPoint){
//시작 부분 표시
System.out.println("=== Before Advice ===");
//날짜를 출력
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
//메서드 이름 출력
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
@After("execution(* me.yuan.bookstudy.used.*Greet.*(..))")//메서드 실행 후에 호출publicvoidafterAdvice(JoinPoint joinPoint){
//시작 부분 표시
System.out.println("=== After Advice ===");
//날짜를 출력
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
//메서드 이름 출력
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
@Around("execution(* me.yuan.bookstudy.used.*Greet.*(..))")//메서드 실행 전후에 호출public Object aroundAdvice(ProceedingJoinPoint joinPoint)throws Throwable {
//시작 부분 표시
System.out.println("=== Arou줌d Advice ===");
System.out.println("*** 처리전 ***");
//지정한 클래스의 메서드 실행
Object result = joinPoint.proceed();
System.out.println("*** 처리후 ***");
//반환값을 돌려줄 필요가 있는 경우에는 Object 타입의 반환값을 돌려줌return result;
}
}
4) Around Advice와 다른 어드바이스와의 차이
- 인수는 ProceedingJoinPoint 인터페이스 타입을 지정
- 어드바이스 중에서 ProceedingJoinPoint 인터페이스의 proceed() 메서드를 호출
- 어드바이스 적용 대상의 메서드를 임의의 타이밍으로 호출할 수 있으므로 전후로 다양한 처리가 가능
7. @Transactional
- 트랜잭션 관리에 사용하는 어노테이션
- 데이터베이스 액세스 처리 메서드가 정상 종료하면 트랜잭션을 커밋하고 예외가 발생하면 롤백