Java框架编程之cglib的应用(2)

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

2.而在spring的管理下应该略加修改的高级decorator
   上面的例子用return enhancer.create();创建子类实例,但在spring管理下,一些bean的实例必须由spring来创建和管理,而不由enhancer来创建的。所以我对上述用法略加修改,使它真正当一个proxy的角色,请对比黑体字的部分


 

  public class logdaoproxy implements methodinterceptor
  {
       
private logger log=logger.getlogger(logdaoproxy.class);
       
private object dao=null;
       
private enhancer enhancer=new enhancer();
        
//返回dao的子类
       public object getdao(class clz,object dao)
       {
           
this.dao = dao;
           enhancer.setsuperclass(clz);
           enhancer.setcallback(
this);
           
return enhancer.create();
       }      
       
//默认的拦截方法
      public object intercept(object o,method method,object[] args,methodproxy proxy) throws throwable
      {
           log.info(
"调用日志方法"+method.getname());
           object result
=proxy.invoke(dao, args);
           
return result;
      }(www.iocblog.net 文章来源)
  }


可见,原来模式里在getdao()时由enhancer创建dao,而 调用intercept时则将enhancer创建的dao以object o参数传回。
而新模式里,dao在getdao()时从外面传入,enhancer.create()返回的是一个proxy. 而调用intercept时,实际会用之前传入的dao进行操作,而忽略object o参数传入的proxy.

有点遗憾, intercept函数里methodproxy的signature是固定的 , 即客户如果调用foo(string),你不可以用proxy.invoke偷换成foo(string,string);

上一页 [1] [2]


Tag: cglib



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