Java框架编程之cglib的应用

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

   作者:江南白衣 

   反射、proxy和元数据是java最强的三个特征,再加上cglib (code generation library)和asm,使得java虽然没有ruby,python般后生可畏,一样能做出强悍的框架。
   proxy可以看作是微型的aop,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,spring的源码里用proxy就用得很随便,看得我非常眼红。可惜proxy必须基于接口。因此spring的做法,基于接口的用proxy,否则就用cglib。aop么,一般小事非compoent一级的就不麻烦aspectj出手了。

    cglib的enhancer说起来神奇,用起来一页纸不到就讲完了。
    它的原理就是用enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了methodinterceptor接口的proxy的intercept() 函数:
 

public object intercept(object o,method method,object[] args,methodproxy proxy)


 在intercept()函数里,你可以在执行object result=proxy.invokesuper(o,args);来执行原有函数,在执行前后加入自己的东西,改变它的参数值,也可以瞒天过海,完全干别的。说白了,就是aop中的around advice。
 

    aop没有出现以前,该领域经典的设计模式是decorator,像java io stream的设计就是如此.不过,如果为每个dao, 每个方法的写decorator函数会写死人的,所以用上cglib的好处是一次过拦截所有方法。 

     另外,cglib除了enhancer之外,还有bulkbean和transform,都是hibernate持久化的基础,但文档贫乏,一时还没去看怎么用。

1.aop里讲了一百遍阿一百遍的log aspect在cglib是这样做的:
 


   
public class logdaoproxy implements methodinterceptor
   {
       
private logger log=logger.getlogger(logdaoproxy.class);
       
private enhancer enhancer=new enhancer();
        
//返回dao的子类
       public object getdao(class clz)
       {
           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.invokesuper(o,args);
           
return result;
      }
   }


    应用的代码:
 

    logdaoproxy proxy = new logdaoproxy();
    goodsdao  dao 
= (goodsdao)proxy.getdao(goodsdao.class);
    dao.insert(goods);


[1] [2] 下一页


Tag: cglib



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