怎么使用动态代理实现AOP功能(2)

分类: J2EE   出处:iocblog整理  更新时间:2009-06-24   添加到收藏  

    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呢?

上一页 [1] [2]


Tag: AOP ,动态代理



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。