Java框架编程之cglib的应用
作者:江南白衣
反射、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() 函数:
在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;
}
}
应用的代码:
goodsdao dao = (goodsdao)proxy.getdao(goodsdao.class);
dao.insert(goods);
Tag: cglib
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。