天下·网吧联盟
登录 申请网盟通行证 忘记密码 逛逛论坛
当前位置:首页 >> 技术纵横 >> 编程基地 >> Java编程应用:使用动态代理实现AOP功能
Java编程应用:使用动态代理实现AOP功能
作者:佚名  2008年04月09日  来源:赛迪网
收藏本文  打印此页  举报本文  评论  投稿

一、使用的背景(也不能算是使用的背景,最多只能算是一个在什么条件下面我想到了使用动态代理实现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());

}

}

声明:本站所发表的文章与图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:editor@untx.com。
网友评论
昵称: 验证码: 看不到图片?点击刷新验证码。

* 请各位网友遵纪守法并注意语言文明。 * 已登陆的会员才能发表评论。
*《互联网电子公告服务管理规定》 *《全国人大常委会关于维护互联网安全的规定》

网盟藏经阁

无盘网吧利好多多 无盘网吧利好多多
  中国人的无盘工作系统,大约在1997年走向社会,走进网吧。历经10多年的磨砺,无盘工作系统逐渐得到....[详情]
教你做网吧广告——百万格子网吧版 教你做网吧广告——百万格子网吧版
在网吧做广告已非新鲜事,但如何充分发挥网吧优势,“压榨”出更多的广告,想必大家也在绞尽脑汁了[详情]
不用拆机箱,不用Ghost,飞速传系统 不用拆机箱,不用Ghost,飞速传系..
  用ghost server进行网络克隆是个不错的主意,但是,克隆之前要给母盘作准确无误的整盘镜像,克隆过....[详情]
网管必学:将“SP3”集成至XP安装盘 网管必学:将“SP3”集成至XP安装..
  随着最近Vista的不断炒作,相信短期内Windows XP SP3的正式版本是发布无望了,但正所谓自己动手丰....[详情]
Ghost增量备份:集成补丁+GHO+下载=更稳定 Ghost增量备份:集成补丁+GHO+下载..
  微软Windows漏洞百出,几乎每隔一段时间就会推出一些高危补丁(Critical Patches),而这些补丁如....[详情]

百度主题推广

网站地图 | 关于天下 | 商务合作 | 广告投放 | 投稿指南 | 联系方式 | 友情链接 | 版权声明 | 免责条款 | 隐私保护
新 宽 联 数 码] 中国网吧增值业务领头羊
新宽联数码 2000 - 2008 建设 - 维护 - 版权所有 粤B2-20040365号
广州网监-报警岗亭