首页  韩国资源  酷站加油  我的展厅  设计名站  古典元素  推荐下载  设计欣赏  每周专访  招募精英  人才专区  网页教程  平面设计  编程开发  设计竞赛
当前位置:首页 > 编程开发 > JSP教程 > 正文
Google
使用动态代理实现AOP功能
来源:赛迪网 2008年04月09日 08:39 网友评论:0条 点击:

一、使用的背景(也不能算是使用的背景,最多只能算是一个在什么条件下面我想到了使用动态代理实现AOP的拦截功能):因为在项目中程序的结构是使用SOAP调用JNI,因此在SOAP服务端里面没有任何实现代码,仅仅是new一个JNI的对象,然后调用JNI对应的方法。但是在调用JNI方法之前需要对传进JNI的JavaBean进行初始化,而且还需要记录日志。而SOAP服务端的代码是通过ant自动生成的,需要对他进行手工的修改,在修改过程中发现每一个方法里面都是相同的:记录进入方法的日志、初始化JavaBean和记录退出方法的日志,这写东西都是通过拷贝粘贴来完成的,想到如果以后再加一个什么功能的时候又得每一个方法进行拷贝粘贴,而且方法的数量还不少,所以觉得这样来实现是不科学的。示例代码如下:


public class SOAP{

private JniInterface jni = null;

private Log log = 。。。;

public SOAP(){

jni=new JniClass();

}


/**方法A**/

public JavaBeanA aMethod(JavaBeanA javaBeanA){

log.debug("进入A方法");

//初始化JavaBean

Init(javaBeanA);

//调用JNI对应的方法

JavaBeanA result = jni.aMethod(javaBeanA);

log.debug("退出A方法");

return result;

}

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

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

等等,很多这样的方法

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

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

}


从示例代码里面可以看出,除了调用JNI对应的方法不同之外,其他的都是相同的代码,把所有的东西进行拷贝复制是不合理的。每当对SOAP进行修改,就必须将所有的方法重新拷贝粘贴。为了省去拷贝粘贴这一工序,所以使用动态代理实现AOP拦截共能。


二、实现AOP拦截

1.定义Interceptor接口

public interface Interceptor {

//在调用之前调用该方法

public void before(InvokeJniInfo invInfo);

//在调用之后调用该方法

public void after(InvokeJniInfo invInfo);

//出现异常之后调用该方法

public void exceptionThrow(InvokeJniInfo invInfo);

}

2. 定义 InvokeJniInfo 类

在Interceptor接口中的InvokeJniInfo类,该类的定义如下:

public class InvokeJniInfo {

//被代理的对象

Object proxy;

//被调用的方法

Method method;

//被调用方法的参数列表

Object[] args;

//调用之后的结果

Object result;

//抛出的异常

Throwable exception;


public InvokeJniInfo(Object proxy,

Method method,

Object[] args,

Object result,

Throwable exception){

this.proxy = proxy;

this.method = method;

this.args = args;

this.result = result;

this.exception = exception;

}

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

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

所有成员的get/set方法

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

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

}

从该类的成员变量可以知道,这个类使用来将调用函数的基本信息如代理的对象,调用的方法,调用方法的参数等信息传递给Interceptor,使得在Interceptor 之中可以通过使用该对象作出相应的拦截。


3.实现一个抽象的拦截器AbstractInterceptor

该拦截器实现了Interceptor接口,它里面的方法全都是空的,其目的是当某些拦截器只是需要实现三个方法中的一个方法或者两个方法的时候,就可以继承该抽象类,覆盖需要的实现的方法就可以了。

4.实现日志记录拦截器LogInterceptor

该拦截器主要是实现在调用之前记录日志,调用之后记录日志和出现异常的时候记录日志。其代码如下:

public class LogInterceptor implements Interceptor {

private Log log = LogFactory.getLog(“初始化Log” );

public void before(InvokeJniInfo invInfo) {

//调用InvokeJniInfo对象的Method的getName方法获取方法名

log.debug("Enter the" + invInfo.getMethod().getName());

}

public void after(InvokeJniInfo invInfo) {

//调用InvokeJniInfo对象的Method的getName方法获取方法名

log.debug("Exit the" + invInfo.getMethod().getName());

}

public void exceptionThrow(InvokeJniInfo invInfo) {

//调用InvokeJniInfo对象的Method的getName方法获取方法名

log.error("Call the" + invInfo.getMethod().getName() + " has error!");

//调用InvokeJniInfo对象的Exception的getStackTrace方法获取具体异常并记录

log.error(invInfo.getException().getStackTrace());

}

}

首页 上一页 [1] [2] 下一页 尾页
上一篇:Java关键字new和newInstance的区别   下一篇:JSP环境中如何配置和使用fckeditor
收藏此页】【打印】【关闭
 相关文章  我要点评
·男性穿浅色内裤可保护性功能
·关于Java EJB的存取和实现
·食用高蛋白低脂肪食物6周可改善性功能
·学习J2ME的几个重要的功能
·web2.0网站功能图标png
·埋没中的功能型站点推广心得
·新功能(设计)如何上线?
·23岁后失去童贞易出现性功能障碍

免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请联络:68design#163.com
转载要求:作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印。



关于我们 | 在线反馈 | 广告报价 | 友情链接 | 联系我们 | 免责声明 | 在线投稿 | 网站地图
Copyright © 2003-2007 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】