WEB开发网
开发学院WEB开发Jsp Java下的框架编程之cglib的应用 阅读

Java下的框架编程之cglib的应用

 2008-01-05 08:27:39 来源:WEB开发网   
核心提示: 作者:江南白衣 反射、PRoxy和元数据是java最强的三个特征,再加上CGLib (Code Generation Library)和ASM,Java下的框架编程之cglib的应用,使得Java虽然没有Ruby,Python般后生可畏,都是Hibernate持久化的基础,但文档贫乏,一样能做出强悍的框架,

  作者:江南白衣 

  反射、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() 函数:

Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">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;
   }
  }
   应用的代码:

Tags:Java 框架 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接