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

5.实现初始化JavaBean拦截器InitParamsInterceptor

该类继承AbstractInterceptor,只需覆盖before方法即可。其代码如下:

public class InitParamsInterceptor extends AbstractInterceptor {


public void before(InvokeJniInfo invInfo) {

if(invInfo.getArgs().length>0){

//初始化第一个参数

InitContainsObjectNullUtil.initContainsOutParameter(invInfo.getArgs()[0]);

}

}


}

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] 下一页 尾页
上一篇:Java关键字new和newInstance的区别   下一篇:JSP环境中如何配置和使用fckeditor
收藏此页】【打印】【关闭
 相关文章  我要点评
·网站功能结构发展的几个形式探讨
·男性穿浅色内裤可保护性功能
·关于Java EJB的存取和实现
·食用高蛋白低脂肪食物6周可改善性功能
·学习J2ME的几个重要的功能
·web2.0网站功能图标png
·埋没中的功能型站点推广心得
·新功能(设计)如何上线?

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



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