2013년 7월 23일 화요일

Spring AOP HelloWorld

예제에서는 “안녕”을 출력하는 클래스를 작성하고 이를 런타임에 AOP를 적용하여 “안녕 OnJ”를 출력하게 된다.
 
1.     AOP 구현을 위해 maven으로 cglib2.2.2  라이브러리 추가

2.     HelloWorld.java 작성(타겟 객체)
 
package onj.hello.aop;
:namespace prefix = o /> 
/*
단순히 "안녕" 이라고 출력하는 메소드 sayHello() 있다. 클래스에 어드바이스를
추가해 sayHello() "안녕  OnJ" 출력하고자 한다.
이를 위해 "안녕"이라는 코드를 출력 일부 코드를 실행해서 "OnJ" 출력해야 한다.
여기에서 필요한 내용이  어라운드어드바이스 인데 조인포인트인 sayHello() 주변에서
 실행된다.
*/
 
public class HelloWorld {
       public void sayHello() {
             System.out.print("\n안녕");
       }
}
 
 
 
 
3.     어드바이스 구현체인 MsgDecorator.java 작성
 
package onj.hello.aop;
 
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
 
/*
 * 어라운드 어드바이스의 구현체
 * MethodInterceptor 메소드 호출용 어라운드 어드바이스의 표준 인터페이스이다.
 * MethodInvocation 어드바이스를 추가하기 위한 메소드 호출을 나타내며
 * 객체를 사용하면 메소드 호출이 실행되는 시점을 제어할 있다.
 *
 */
public class MsgDecorator implements MethodInterceptor {
       public Object invoke(MethodInvocation invocation) throws Throwable {
             Object ret = invocation.proceed();  //HelloWorld 클래스의 sayHello() 실행
             System.out.println(" " + "OnJ");
             return ret;                     
       }
}
 
 
 
4.     어드바이스 위빙하고 이를 실행하는 HelloWorldAopExam.java
 
package onj.hello.aop;
 
import org.springframework.aop.framework.ProxyFactory;
 
/*
 * MsgDecorator 위빙
 * 타겟인 HelloWorld 인스턴스를 생성하고 인스턴스의 프록시를 만든
 * 프록시팩터리가 MsgDecorator 어드바이스를 위빙
 */
public class HelloWorldAopExam {
       public static void main(String[] args) {
             HelloWorld target = new HelloWorld();        
            
              //Proxy 생성
             ProxyFactory pf = new ProxyFactory();
            
             //어드바이스를 추가
             pf.addAdvice(new MsgDecorator());
            
             //위빙할 타겟을 정의
             pf.setTarget(target);
            
             //프록시 생성
             HelloWorld proxy = (HelloWorld)pf.getProxy();
            
             //HelloWorld sayHello()호출
             target.sayHello();
            
             //프록시의 sayHello 호출
             proxy.sayHello();
       }
}
 
 
 
5.     실행결과
 
안녕
안녕 OnJ

댓글 없음:

댓글 쓰기