怎么使用动态代理实现AOP功能(2)
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<len;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;[iocblog.net 来源]
}
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呢?
Tag: AOP ,动态代理
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。