AOP(aspect orineted programming)
-> concern을 분리함으로써 관점에따라 모듈화할 수 있도록 한다.
코드를 수정하기보다 advice를 추가(혹은 분리)함으로써 좀 더 편리하게 프로그래밍을 수행한다.
주요용어
Advice : 수행해야하는 기능
Jointpoint : Advice를 적용하는 위치
Pointcut : Jointpoint의 부분으로 실제로 Advice가 적용된 부분
Weaving : Advice를 핵심기능에 적용하는 행위
1. Before
메소드 수행 전에 실행하는 advice
package spring.aop.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class LogBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("메소드 수행 전 실행되는 advice");
//target 함수호출 필요 x
}
}
2. AfterRetruning
메소드 수행 후에 실행하는 advice
package spring.aop.advice;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class LogAfterReturningAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
//target 실행 후 실행
System.out.println("returnValue:"+returnValue+" method: "+method.getName());
}
}
4. Around
메소드 수행 전/후에 실행하는 advice
package spring.aop.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LogAroundAdvice implements MethodInterceptor{
//context 사용한 proxy
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
long start = System.currentTimeMillis();
//원래 업무 호출
Object result = invocation.proceed();
long end = System.currentTimeMillis();
String message = (end-start) + "ms 시간이 걸렸습니다.";
System.out.println(message);
return result;
}
}
4. AfterThrowing
메소드 수행 시 예외발생하면 처리하기 위해 실행하는 advice
package spring.aop.advice;
import org.springframework.aop.ThrowsAdvice;
public class LogAfterThrowingAdvice implements ThrowsAdvice{
//예외 발생시 실행
public void afterThrowing(IllegalArgumentException e) throws Throwable{
System.out.println("예외 발생: "+e.getMessage());
}
}
Pragram.java
public static void main(String[] args) {
ApplicationContext context =
//new AnnotationConfigApplicationContext(NewlecDIConfig.class);
new ClassPathXmlApplicationContext("spring/aop/setting.xml");
//원래 업무
//Exam exam = new NewIecExam(1, 1, 1, 1);
Exam proxy = (Exam)context.getBean("proxy");
System.out.printf("total is %d\n", proxy.total());
System.out.printf("total is %f\n", proxy.avg());