2013년 10월 25일 금요일

[Spring AOP]프로그래밍을 통한 스프링충고(Spring AOP Advice)(Before, After, Around, AfterReturning, Throws)

[Spring AOP]프로그래밍을 통한 스프링충고(Spring AOP Advice)(Before, After, Around, AfterReturning, Throws)

1. 주변충고 (around advice)
 
 org.aopallince.intercept.MethodInterceptor
 대상메소드에 대한 호출을 가로챔. 메소드 호출 전/후 실행. 필요하다면 자체 구현을 통해 메소드 실행을 SKIP 가능

2. 사전충고 (before advice)
 
 org.springframework.aop.MethodBeforeAdvice
 스프링의 조인포인트는 항상 메소드 호출이므로 사전충고는 메소드 실행전에 전처리 기능을 한다. 대상메소드가 실행되기 전에 호출됨

3. 사후충고 (after returning advice)
 org.springframework.aop.AfterReturningAdvice
 대상메소드가 리턴한후에 호출됨. 메소드 호출타겟, 메소드로 넘어온 인자, 반환값등에 접근가능하며 이 어드바이스가 호출될 때 이미 메소드가 실행되었으므로 메소드 호출제어 불가능

4. 예외충고 (throws advice)
 
 org.springframework.aop.ThrowsAdvice
 대상메소드가 예외를 던질때 호출됨.
이 충고를 이용하면 특정 예외 접근가능하며 예외를 던진 메소드, 메소드 호출 인자, 호출 타겟에 접근할 수 있다.
 
5. 사후충고(finally)

(after advice)
 org.aopallince.intercept.AfterAdvice
 After-returning 어드바이스는 조인포인트의 메소드 실행을 마치고 값을 반환한 후 실행. 하지만 after(finally) 어드바이스는 메소드의 실행 결과와 관계없이 실행 즉 오류나서 예외를 던지더라도 실행된다. 
 
 
public interface SmallMartInterface {
   public void getProducts(String productName) throws Exception ;
}
 
 
 
 
 
public class SmallMart implements SmallMartInterface {
public void getProducts(String productName) throws Exception {
   System.out.println(“getProduct()…” + productName);
   throw new Exception(“Error…”);  //예외 발생 시킴
}//:
}///~
 
 
 
 
// 실행시  cglib 라이브러리 추가할 것, Spring3.2 이상이면 CGLIB 필요 없음
public class SmallMartApp {

public static void main(String[] args) {

SmallMart target = new SmallMart();

ProxyFactory pf = new ProxyFactory();
pf.addAdvice(new BeforeLoggingAdvice());
pf.addAdvice(new AfterLoggingAdvice());
pf.addAdvice(new AroundLoggingAdvice());
pf.addAdvice(new ThrowsLoggingAdvice());

pf.setTarget(target);
try {
SmallMart proxy = (SmallMart)pf.getProxy();
proxy.getProducts("생필품");
} catch (Exception e) { e.printStackTrace(System.out);  }
}//:
}///~
 
 
 
 
 
 
 
package oraclejava.training.aop;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeLoggingAdvice  implements MethodBeforeAdvice {
  public void before(Method arg0, Object[] arg1, Object arg2)
  throws Throwable {
                //대상 메소드의 첫번째 인자를 캐스팅(String productName) …
  String findName = (String)arg1[0];
  System.out.println(arg0.getName() + “:: 사전충고."); 
  }//:
}///
 
 
 
 
 
 
 
package oraclejava.training.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class AfterLoggingAdvice  implements AfterReturningAdvice {

  public void afterReturning(Object arg0, Method arg1, Object[] arg2,
  Object arg3) throws Throwable {
  System.out.println(arg1.getName() + “ : 사후충고 "); 
  }//:
}///~
 
 
 
 
public class AroundLoggingAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation arg0) throws Throwable {
String findName = (String)arg0.getArguments()[0];
if(findName == null) {
throw new Throwable("예외");
}
System.out.println("메소드 실행전");
Object returnedObj = arg0.proceed();
System.out.println("메소드 실행후");
return returnedObj;
}//:
}///~
 
 
 
 
 
public class ThrowsLoggingAdvice  implements ThrowsAdvice {
//public void afterThrowing(Method method, Object[] args,  Object target,
//Throwable throwable) {
//}//:

public void afterThrowing(Throwable throwable) {
  System.out.println("에러발생");
}
}

댓글 없음:

댓글 쓰기