2014년 3월 10일 월요일

ProxyFactory를 이용한 프로그램을 통한 AOP구현예제(Spring Framework3.X AOP구현하기,Advice, Pointcut), 스프링 프록시, ProxyFactory예제교육, 스프링프록시교육, Spring Framework교육 - 다음과 같은 인터페이스와 타겟 클레스가 있다. interface OnjWorld { public void onjHello(); public void onjHello2(); } public class OnjWorldImpl implements OnjWorld { public void onjHello() { System.out.println("OnJ에오신것을 환영합니다."); } public void onjHello2() { System.out.println("OnJ2에오신것을 환영합니다."); } } 위 OnjWorldImpl이 타겟 클래스이다. onjHello2 로 시작하는 메소드에 스프링 충고를 내릴려고 한다. 충고(Advice)는 적당히 콘솔화면에 출력하는 정도로 만들고... before advice, around advice, throws advice, ,after returning advice를 구현하시오. - 프로그래밍적인 방법으로 구현해 보았다. 정적인 클래스 이름과 메소드 이름으로 포인트컷을 만들기 위해 StaticMethodMatcherPointcut을 상속해서 포인트컷을 만들었고... 기존 예제와 다든 점은 하나의 어드바이스에 충고가 여러개인 경우를 처리하는 방법입니다. OnjClient.java 예제를 참고하세요. 0.0 인터페이스 OnjWorld.java package onj.aop.programming; interface OnjWorld { public void onjHello(); public void onjHello2() throws Exception; } 0.1 인터페이스 구현 클래스 OnjWorldImpl.java package onj.aop.programming; public class OnjWorldImpl implements OnjWorld { public void onjHello() { System.out.println("OnJ에오신것을 환영합니다."); } public void onjHello2() throws Exception { System.out.println("OnJ2에오신것을 환영합니다."); throw new Exception("OnJ Exception..."); } } 1.AfterLoggingAdvice.java package onj.aop.programming; 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() + ":: 사후충고"); } } 2. AroundLoggingAdvice.java package onj.aop.programming; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class AroundLoggingAdvice implements MethodInterceptor { public Object invoke(MethodInvocation arg0) throws Throwable { System.out.println("메소드실행전..."); Object returnedObj = arg0.proceed(); System.out.println("메소드실행후..."); return returnedObj; }// :}///~ } 3. BeforeLoggingAdvice.java package onj.aop.programming; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class BeforeLoggingAdvice implements MethodBeforeAdvice{ public void before(Method arg0, Object[] arg1, Object arg2)throws Throwable{ System.out.println(arg0.getName() + "::: 사전충고"); } } 4. ThrowsLoggingAdvice.java package onj.aop.programming; import org.springframework.aop.ThrowsAdvice; public class ThrowsLoggingAdvice implements ThrowsAdvice { public void afterThrowing(Throwable throwable) { System.out.println(">>>>>>>> 에러발생 " + throwable); } } 5. 이번에는 포인트컷이다. SimpleStaticPointcut.java package onj.aop.programming; import java.lang.reflect.Method; import org.springframework.aop.ClassFilter; import org.springframework.aop.support.StaticMethodMatcherPointcut; public class SimpleStaticPointcut extends StaticMethodMatcherPointcut {// 아래는First.class의one()메소드일때충고가적용된다. public boolean matches(Method method, Class cls) { return ("onjHello2".equals(method.getName())); } public ClassFilter getClassFilter() { return new ClassFilter() { public boolean matches(Class cls) { return (cls == OnjWorldImpl.class); } }; } } 6. 실행을 위한 클라이언트 프로그램 OnjClient.java 충고가 여러개인 경우 충고마다 Advisor를 만들어서 ProxyFactory에 여러 Advisor 넣었습니다. package onj.aop.programming; import org.aopalliance.aop.Advice; import org.springframework.aop.Advisor; import org.springframework.aop.Pointcut; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; public class OnjClient { public static void main(String[] args) { OnjWorldImpl target = new OnjWorldImpl(); ProxyFactory pf = new ProxyFactory(); Pointcut pc = new SimpleStaticPointcut(); Advice before = new BeforeLoggingAdvice(); Advice after = new AfterLoggingAdvice(); Advice around = new AroundLoggingAdvice(); Advice throwsAdvice = new ThrowsLoggingAdvice(); Advisor advisor1= new DefaultPointcutAdvisor(pc,before); Advisor advisor2= new DefaultPointcutAdvisor(pc,after); Advisor advisor3= new DefaultPointcutAdvisor(pc,around); Advisor advisor4= new DefaultPointcutAdvisor(pc,throwsAdvice); pf.addAdvisors(advisor1,advisor2, advisor3, advisor4); pf.setTarget(target); try { OnjWorld proxy = (OnjWorld) pf.getProxy(); proxy.onjHello(); proxy.onjHello2(); } catch (Exception e) { e.printStackTrace(System.out); } } } 7. 결과 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/java/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/C:/Documents%20and%20Settings/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.6.6/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] OnJ에오신것을 환영합니다. onjHello2::: 사전충고 메소드실행전... OnJ2에오신것을 환영합니다. >>>>>>>> 에러발생 java.lang.Exception: OnJ Exception... java.lang.Exception: OnJ Exception... at onj.aop.programming.OnjWorldImpl.onjHello2(OnjWorldImpl.java:10) at onj.aop.programming.OnjWorldImpl$$FastClassByCGLIB$$4c0178cb.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at onj.aop.programming.AroundLoggingAdvice.invoke(AroundLoggingAdvice.java:9) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:51) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:51) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) at onj.aop.programming.OnjWorldImpl$$EnhancerByCGLIB$$cb4b3dbf.onjHello2() at onj.aop.programming.OnjClient.main(OnjClient.java:35) [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSpring&wr_id=380 자바 오라클/빅데이터 아이폰/안드로이드 닷넷/WPF 표준웹/HTML5 채용/취업무료교육 초보자코스 [기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 총 5일 40시간 03-17 [기업100%환급]Spring ,MyBatis,Hibernate실무과정 총 5일 40시간 03-31 Spring3.X, MyBatis, Hibernate실무과정 총 12일 36시간 03-20 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 24일 72시간 03-21 자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정 총 40일 120시간 03-27 Spring3.X, MyBatis, Hibernate실무과정 총 5일 35시간 03-15 JAVA&WEB프레임워크실무과정 총 14일 98시간 03-15 [주말저녁]자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 총 18일 72시간 03-15

ProxyFactory를 이용한 프로그램을 통한 AOP구현예제(Spring Framework3.X AOP구현하기,Advice, Pointcut), 스프링 프록시, ProxyFactory예제교육, 스프링프록시교육, Spring Framework교육

- 다음과 같은 인터페이스와 타겟 클레스가 있다. 

interface OnjWorld { 
public void onjHello(); 
        public void onjHello2(); 


public class OnjWorldImpl implements OnjWorld { 
public void onjHello() { 
System.out.println("OnJ에오신것을 환영합니다."); 

public void onjHello2() { 
System.out.println("OnJ2에오신것을 환영합니다."); 
}


위 OnjWorldImpl이 타겟 클래스이다. onjHello2 로 시작하는 메소드에 스프링 충고를 내릴려고 한다. 
충고(Advice)는 적당히 콘솔화면에 출력하는 정도로 만들고... 
before advice, around advice, throws advice, ,after returning advice를 구현하시오. 

- 프로그래밍적인 방법으로 구현해 보았다.


정적인 클래스 이름과 메소드 이름으로 포인트컷을 만들기 위해 StaticMethodMatcherPointcut을 상속해서 포인트컷을 만들었고...  기존 예제와 다든 점은 하나의 어드바이스에 충고가 여러개인 경우를 처리하는 방법입니다. 

OnjClient.java 예제를 참고하세요. 


0.0 인터페이스 OnjWorld.java

package onj.aop.programming;

interface OnjWorld {
public void onjHello();
public void onjHello2() throws Exception;
}


0.1 인터페이스 구현 클래스 OnjWorldImpl.java


package onj.aop.programming;

public class OnjWorldImpl implements OnjWorld {
public void onjHello() {
System.out.println("OnJ에오신것을 환영합니다.");
}

public void onjHello2() throws Exception {
System.out.println("OnJ2에오신것을 환영합니다.");
throw new Exception("OnJ Exception...");
}
}




1.AfterLoggingAdvice.java

package onj.aop.programming;

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() + ":: 사후충고");
}
}



2. AroundLoggingAdvice.java

package onj.aop.programming;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class AroundLoggingAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("메소드실행전...");
Object returnedObj = arg0.proceed();
System.out.println("메소드실행후...");
return returnedObj;
}// :}///~
}


3. BeforeLoggingAdvice.java

package onj.aop.programming;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class BeforeLoggingAdvice implements MethodBeforeAdvice{
public void before(Method arg0, Object[] arg1, Object arg2)throws Throwable{
System.out.println(arg0.getName() + "::: 사전충고");
}
}

4. ThrowsLoggingAdvice.java

package onj.aop.programming;


import org.springframework.aop.ThrowsAdvice;

public class ThrowsLoggingAdvice implements ThrowsAdvice {
public void afterThrowing(Throwable throwable) {
System.out.println(">>>>>>>> 에러발생 " + throwable);
}
}


5. 이번에는 포인트컷이다. SimpleStaticPointcut.java

   package onj.aop.programming;

import java.lang.reflect.Method;

import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.StaticMethodMatcherPointcut;

public class SimpleStaticPointcut extends StaticMethodMatcherPointcut {// 아래는First.class의one()메소드일때충고가적용된다.
public boolean matches(Method method, Class<?> cls) {
return ("onjHello2".equals(method.getName()));
}

public ClassFilter getClassFilter() {
return new ClassFilter() {
public boolean matches(Class<?> cls) {
return (cls == OnjWorldImpl.class);
}
};
}
}


6. 실행을 위한 클라이언트 프로그램  OnjClient.java
 
충고가 여러개인 경우 충고마다 Advisor를 만들어서 ProxyFactory에 여러 Advisor 
넣었습니다.

package onj.aop.programming;

import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;

public class OnjClient {
public static void main(String[] args) {
OnjWorldImpl target = new OnjWorldImpl();
ProxyFactory pf = new ProxyFactory();
Pointcut pc = new SimpleStaticPointcut();
Advice before = new BeforeLoggingAdvice();
Advice after = new AfterLoggingAdvice();
Advice around = new AroundLoggingAdvice();
Advice throwsAdvice = new ThrowsLoggingAdvice();
Advisor advisor1= new DefaultPointcutAdvisor(pc,before);
Advisor advisor2= new DefaultPointcutAdvisor(pc,after);
Advisor advisor3= new DefaultPointcutAdvisor(pc,around);
Advisor advisor4= new DefaultPointcutAdvisor(pc,throwsAdvice);
pf.addAdvisors(advisor1,advisor2, advisor3, advisor4);
pf.setTarget(target);
try {
OnjWorld proxy = (OnjWorld) pf.getProxy();
proxy.onjHello();
proxy.onjHello2();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}


7. 결과

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/java/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Documents%20and%20Settings/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.6.6/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
OnJ에오신것을 환영합니다.
onjHello2::: 사전충고
메소드실행전...
OnJ2에오신것을 환영합니다.
>>>>>>>> 에러발생 java.lang.Exception: OnJ Exception...
java.lang.Exception: OnJ Exception...
at onj.aop.programming.OnjWorldImpl.onjHello2(OnjWorldImpl.java:10)
at onj.aop.programming.OnjWorldImpl$$FastClassByCGLIB$$4c0178cb.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at onj.aop.programming.AroundLoggingAdvice.invoke(AroundLoggingAdvice.java:9)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:51)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:51)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
at onj.aop.programming.OnjWorldImpl$$EnhancerByCGLIB$$cb4b3dbf.onjHello2(<generated>)
at onj.aop.programming.OnjClient.main(OnjClient.java:35)


댓글 없음:

댓글 쓰기