我的联盟 作品 招聘 外包 人才  酷站加油 国内 国外 CSS  资源图库 图库 模板 矢量 图标  设计欣赏 界面 LOGO 插画 艺术  网页 平面  专访 名站 竞赛 社区
当前位置:首页 > 编程开发 > JSP教程 > 正文
使用动态代理实现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
收藏此页】【打印】【关闭
 相关文章  我要点评
·优酷推网页断点续传功能
·专注核心功能
·雅虎推出新版电邮服务 增加新社交功能
·腾讯收购gaopeng域名 或为Groupon入华准备
·Photoshop CS5新增功能实例详解
·photoshop CS5新功能混合器画笔工具
·从日文输入法项目看心理模型和实现模型
·群组功能代替论坛的可行性

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



关于我们 | 设计服务 | 广告服务 | 常见问题 | 网站地图 | 法律声明 | 联系我们
Copyright © 2003-2012 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】