中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 综合文章
Java下的Framework编写(3)--cglib的应用
作者:未知 时间:2005-07-27 22:40 出处:CSDN 责编:chinaitpower
              摘要:Java下的Framework编写(3)--cglib的应用

    反射、Proxy和元数据是Java框架最强的三个特征。
    Proxy可以看作是微型的AOP,的的确确提供了代码在继承和委托之外的第三个封装途径(河的第三条岸?),只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。
    选择cglib (Code Generation Librayr),是因为AOP框架一般比较大,丁点事情都要在XML文件里配置一番,所以要到Component级的事情才好麻烦AspectJ它们出手,平时的小代码封装,拿个cgilb/proxy玩玩就够了。众所周知,jdk自带的动态proxy必须基于接口,所以就跟风hibernate,用一下cglib。

   cglib说起来神奇,用起来一页纸不到就讲完了。
    它的原理就是用Enhancer类生成一个原有类的子类,则原有类的每个方法调用都会调用它的MethodInterceptor接口的public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy)函数
    在intercept()函数里,你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数,在执行前后加入自己的东西,也可以瞒天过海,完全干别的。

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

   public class LogDAOProxy implements MethodInterceptor
  {
       private Logger log=Logger.getLogger(AOPInstrumenter.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);

     2.而我今天小试菜刀实现的是一个高级的Decorator模式:
        上面的例子其实有点虚,因为DAO都是由Spring管理的,不能这么随便new出来。所以更实际采用Decorator模式,把方法实际扔给Spring管辖下的DAO去完成。但如果每个DAO, 每个方法的写Decorator函数会写死人的,所以用上cglib。注意黑体字的部分。

   public class LogDAOProxy implements MethodInterceptor
  {
       private Logger log=Logger.getLogger(AOPInstrumenter.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;
      }
}

相关文章:
Java下的Framework编写(反射,泛型,元数据,CGLib,AOP,IOC)(1)--序
Java下的Framework编写(2)--泛型的应用
Java下的Framework编写(3)--cglib的应用 

any other Things
  
  为方法调用增多一个参数的的代码段
  
  Object[] params = new Object[objects.length + 1];
        System.arraycopy(objects, 0, params, 0, objects.length);
        params[objects.length] = myParam;

        Object result = methodProxy.invoke(dao, params);
      


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有