`
benqend
  • 浏览: 31845 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

cglib应用

    博客分类:
  • j2se
 
阅读更多
反射、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);

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;
      }
  }

可见,原来模式里在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);

Link:http://www.blogjava.net/calvin/archive/2005/11/28/21741.html
分享到:
评论

相关推荐

    cglib.jar下载

    三、CGLIB的应用 广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。 四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要...

    CGLib和ASM相关jar包

    开发基于CGLib的动态代理应用所需的jar吧,包括CGLib和ASM。因为CGLib是基于ASM的,所以开发CGLib的应用不可没有ASM相关的jar包.

    cglib 和asm jar包

    jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,...

    cglib3.2.10

    cglib的最新版本3.2.10,稳定的字节码生成工具,通过继承方式动态生成代理类的工具,很多应用在拦截、切片中。

    cglib-3.2.7.jar

    其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)

    spring源码阅读所需jar spring-cglib-repack-3.2.8.jar 和spring-objenesis-repack-2.6.jar

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...

    Spring基于Spring框架的Web应用演示(附带cglib工具进行动态代理)

    [Spring]基于Spring框架的Web应用演示(附带cglib工具进行动态代理)

    aspect-cglib.zip

    AOP中,所需要的jar包,cglib-nodep-3.2.5.jar aspectjrt-1.6.8_3-20130313.151215-2.jar aspectjweaver-1.9.5.jar具体的应用常见,见我的博客

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态代理: 我们将详细介绍JDK动态代理的概念和工作原理。您将了解如何使用Java的...

    Spring框架+Spring工作原理+AOP面向切面编程+JDK代理+Cglib代理

    Spring框架是一个开放源代码的J2EE应用程序框架,是对bean的生命周期进行管理的轻量级容器。 适用:中高级开发 Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork等众多Web框架组合使用,并且可以与Swing...

    基于java的企业级应用开发:JDK动态代理.ppt

    CGLIB代理 CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。 如果想代理没有实现接口的类,那么可以使用CGLIB代理。 ...

    Java设计模式及应用场景之《代理模式》

    文章目录一、代理模式定义二、代理模式的结构和说明三、代理模式的分类四、代理模式示例五、动态代理1、JDK动态代理JDK动态代理使用步骤...CGLIB动态代理注意事项六、三种代理方式的对比七、代理模式的应用场景及案例...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    NULL 博文链接:https://bijian1013.iteye.com/blog/2384411

    Spring3.x企业应用开发实战(完整版) part1

    6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 切点类型 6.4.2 切面...

    Spring.3.x企业应用开发实战(完整版).part2

    6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 切点类型 6.4.2 切面...

    spring 3.x企业应用开发实战第二章需要的jar包

    跟着spring3.x企业应用开发实战这本书做练习,结果代码照书里的敲发现各种缺少jar包,一路补充了大概五六个包,把第二章需要的都拷贝进来了。spring部分的jar包可能多了些自行删掉。有asm.jar,cglib.jar,junit.jar...

    spring-struts1-strust2-hibernate 核心包介绍

    cglib.jar CGLIB 字节码解释器 如果使用“cglib”则必要 spring.jar 是包含有完整发布的单个jar包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到...

    Spring开发指南

    Spring初探 准备工作 构建Spring基础代码 Spring 基础语义 Dependency Injection 依赖注入的几种实现类型 Type1 接口注入 Type2 设值注入 ... CGLib 与 Spring AOP AOP 应用 DAO Support Remoting

    《剑指offer》Java代理.pdf

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比 动态代理的实际应用 Spring AOP

Global site tag (gtag.js) - Google Analytics