热门文章 | 热门软件| 热门源码 | 热门电影 | 知识库 | 联系我们
软件 源码 教程 影视 健康 招聘
  HTML | JavaScript | ASP | PHP | JSP | NET | VB | VC | VF | Windows | Linux | Mysql | Mssql | Oracle | Struts 
当前位置: 创世纪计算机资源网 -> 文章频道 ->java 
站内搜索:
Java编程应用:使用动态代理实现AOP功能(2)
作者:店小二 来源:赛迪网 整理日期:2008-4-9

     6.实现动态代理处理器InterceptorHandler

该类实现了java.lang.reflect.InvocationHandler接口。

public class InterceptorHandler implements InvocationHandler {

private static Log log = LogFactory.getLog(InterceptorHandler.class);

//拦截器列表

private List interceptors = null;

//存放原始对象

private Object orginalObject;

//使用Proxy返回一个对象。注意这里传进去的对象的对象必须实现一个接口

public Object bind(Object obj) {

this.orginalObject = obj;

return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj

.getClass().getInterfaces(), this);

}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Object result = null;

Throwable ex = null;

InvokeJniInfo invInfo = new InvokeJniInfo(proxy,method,args,result,ex);

log.debug("Invoking Before Intercepors!");

//实现方法调用之前进行拦截的方法

invokeInterceptorBefor(invInfo);

try{

log.debug("Invoking Proxy Method!");

//调用方法

result = method.invoke(orginalObject,args);

invInfo.setResult(result);

log.debug("Invoking After method!");

//实现方法调用之后进行拦截的方法

invokeInterceptorAfter(invInfo);

}catch(Throwable tr){

invInfo.setException(tr);

log.error("Invoking exceptionThrow method!");

//实现出现异常进行拦截的方法

invokeInterceptorExceptionThrow(invInfo);

}

return result;

}

//获取拦截器列表

private synchronized List getIntercetors(){

if(null == interceptors){

interceptors = new ArrayList();

//添加日志记录拦截器

interceptors.add(new LogInterceptor());

//添加初始化JavaBean拦截器

interceptors.add(new InitParamsInterceptor());

//如果需要添加其他功能,可以很方便的添加其他的拦截器实现功能

}

return interceptors;

}

private void invokeInterceptorBefor(InvokeJniInfo invInfo){

List interceptors = getIntercetors();

int len = interceptors.size();

//遍历所有拦截器,并调用拦截器的before方法

for(int i = 0;i((Interceptor)interceptors.get(i)).before(invInfo);

}

}

private void invokeInterceptorAfter(InvokeJniInfo invInfo){

List interceptors = getIntercetors();

int len = interceptors.size();

//遍历所有拦截器,并调用拦截器的after方法

for(int i = len - 1;i >= 0;i--){

((Interceptor)interceptors.get(i)).after(invInfo);

}

}

private void invokeInterceptorExceptionThrow(InvokeJniInfo invInfo){

List interceptors = getIntercetors();

int len = interceptors.size();

//遍历所有拦截器,并调用拦截器的exceptionThrow方法

for(int i = len - 1;i >= 0;i--){

((Interceptor)interceptors.get(i)).exceptionThrow(invInfo);

}

}

}

7.获取动态代理对象工厂InterceptorFactory

public class InterceptorFactory {

private static Log log = LogFactory.getLog(InterceptorFactory.class);

public static Object getClassInstance(String clzName) {

Class cls;

Object obj = null;

try {

cls = Class.forName(clzName);

obj = (Object) cls.newInstance();

} catch (Exception e) {

log.error(e.getStackTrace());

}

return obj;

}

public static Object getInterceptorProxyedObject(String clzName) {

InterceptorHandler aopHandler = new InterceptorHandler();

Object obj = getClassInstance(clzName);

return aopHandler.bind(obj);

}

}

8.修改以前的代码,使用动态代理实现

public class SOAP{

private JniInterface jni = null;

private Log log = 。。。;

public SOAP(){

jni=(JniInterface)InterceptorFactory.getInterceptorProxyedObject("JniClass");

}

/**方法A**/

public JavaBeanA aMethod(JavaBeanA javaBeanA){

return jni.aMethod(javaBeanA);

}

……………………………………

……………………………………

等等,很多这样的方法

……………………………………

……………………………………

}

从红色代码对比可以看出,省了很多代码。

三、总结

1.必须彻底贯彻针对接口编成这一编程思想。

2.明白了这个,是不是也明白了Spring的AOP的实现了?以及为什么要使用Spring的AOP的时候必须使用他的BeanFactory呢?

[1]  [2]  
相关文章