@Configuration
@EnableAspectAutoProxy
public class AppConfig {
@Bean
public ProductServiceImpl productService() {
return new ProductServiceImpl();
}
@Bean
public ProductDaoImpl productDao() {
return new ProductDaoImpl();
}
@Bean
public MyFirstAspect myFirstAspect() {
return new MyFirstAspect();
}
}
스프링 코어 중 다른 하나인 DIxAOP 컨테이너의 AOP에 대해 알아보기
3.2.2 어노테이션으로 어드바이스 만들기
Before 어드바이스, After 어드바이스
- 어노테이션
@Before("PrimitivePointcut")
@After("PrimitivePointcut")
- 메소드명은 임의
- 메소드의 인수는 없는 것이 기본
- 메소드의 반환값은 void가 기본
@Before("execution(* findProduct(String))")
public void foo() {
// 메소드가 시작 시 동작하는 어드바이스
System.out.println("Hello Before - 메소드 호출 전에 나옴");
}
@After("execution(* findProduct(String))")
public void bar() {
// 메소드 종료 후 동작하는 어드바이스
System.out.println("Hello After - 메소드 호풀 후에 나옴);
}
- Before 어드바이스에 메소드명과 인수로 전달된 값을 조인포인트를 이용해 표시
@Before("execution(* findProduct(String))")
public void foo(JoinPoint jp) {
// 메소드가 시작 시 삽입하는 어드바이스
System.out.println("Hello Before - 메소드 호출 전에 나옴");
Signature sig = jp.getSignature();
System.out.println("메소드 이름: " + sig.getName());
Object[] obj = jp.getArgs();
System.out.println("인수값: " + objs[0]);
}
AfterReturning 어드바이스
- 어노테이션: @AfterReturning(value="PrimitivePointcut", returning="반환값의 변수명")
- 메소드명은 임의
- 메소드의 인수는 AOP 적용 대상이 된 메소드의 반환형과 어노테이션의 returning 속성에서 지정한 변수명으로 해야함
- 메소드의 반환값은 void가 기본
// 반환값이 String인 getMessage 메소드에 어드바이스를 적용
@AfterReturning(value="execution(* getMessage())", returning="ret")
public void hoge(String ret) {
// 메소드 호출이 예외를 내보내지 않고 종료했을 때 호출되는 어드바이스
System.out.println("Hello Returning - 메소드를 호출한 후에 나옴");
System.out.println("반환된 메시지: " + ret);
}
Around 어드바이스
- 어노테이션: @Around("PrimitivePointcut")
- 메소드명은 임의
- 메소드의 파라미터에는 반드시 org.aspectj.lang.ProceedingJoinPoint 기술
- 반환값은 AOP의 대상이 된 메소드의 반환값의 타입과 호환성이 있어야함.
@Around("execution(* getMessage( ))")
public String fuga(ProceedingJoinPoint pjp) throws Throwable {
// 메소드 호출 전, 후로 동작하는 어드바이스
System.out.println("Hello Around - Before 메소드 호출 전에 나옴");
String message = (String)pjp.proceed();
System.out.println("Hello Around - After 메소드 호출 후에 나옴");
return message;
}
AfterThrowing 어드바이스
- 어노테이션: @AfterThrowing(value="PrimitivePointcut", throwing="예외의 변수명")
- 메소드명은 임의
- 메소드의 인수에는 잡고 싶은 예외를 기술하고 그 변수명은 어노테이션의 throwing 속성으로 지정한 "예외의 변수명"과 같아야 함
- 메소드의 반환값은 void가 기본
@AfterThrowing(value="execution(* getMessage())", throwing="ex")
public void boo(SQLException ex) {
// 메소드의 호출이 예외를 던졌을 때 동작하는 어드바이스
System.out.println("Hello Throwing - 예외가 생기면 나옴");
}
3.3 JavaConfig를 이용한 AOP
'개발 > Java & Kotlin' 카테고리의 다른 글
[Spring] 스프링 시큐리티 (2) (0) | 2022.07.05 |
---|---|
[Spring] 스프링 시큐리티 (1) (0) | 2022.07.04 |
[Java] 람다와 스트림(5) (0) | 2022.07.04 |
[Spring] 스프링 AOP (1) (0) | 2022.07.01 |
[Java] 람다와 스트림(4) (0) | 2022.07.01 |