Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AO
Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AOP么,一般小事非compoent一级的就不麻烦AspectJ出手了。 copyright 领测软件测试网
cglib的Enhancer说起来神奇,用起来一页纸不到就讲完了。
ltesting.net
它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept() 函数: copyright 领测软件测试网
public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) 领测软件测试网http://www.ltesting.net 内容来自ltesting.net
|
内容来自ltesting.net
在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是这样做的:
copyright 领测软件测试网
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, http://www.ltesting.net MethodProxy proxy) throws Throwable
{
log.info("调用日志方法"+method.getName());
Object result=proxy.invokeSuper(o,args);
return result;
}
} http://www.ltesting.net copyright 领测软件测试网 领测软件测试网
|
应用的代码:
ltesting.net
LogDAOProxy proxy = new LogDAOProxy();
GoodsDAO dao = (GoodsDAO)proxy.getDAO(GoodsDAO.class);
dao.insert(goods); 内容来自ltesting.net http://www.ltesting.net
|
2.而在Spring的管理下应该略加修改的高级Decorator
内容来自ltesting.net
上面的例子用return enhancer.create();创建子类实例,但在Spring管理下,一些Bean的实例必须由Spring来创建和管理,而不由enhancer来创建的。所以我对上述用法略加修改,使它真正当一个Proxy的角色,请对比黑体字的部分。
领测软件测试网
可见,原来模式里在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);
http://www.ltesting.net
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)
ltesting.net
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, ltesting.net MethodProxy proxy) throws Throwable
{
log.info("调用日志方法"+method.getName());
Object result=proxy.invoke(dao, args);
return result;
}
} copyright 领测软件测试网 copyright 领测软件测试网 http://www.ltesting.net
|
本文标题:Java下的框架编程之cglib的应用http://www.ltesting.net/ceshi/ruanjianceshikafajishu/rjcskfyy/java/2007/0611/40937.html
分享到:
相关推荐
在Java编程中,我们有时需要在运行时动态地创建或修改类,CGLib就是为此目的而设计的。它广泛应用于AOP(面向切面编程)框架,如Spring AOP,以及单元测试工具,如Mockito。 ### CGLib的工作原理 CGLib通过继承目标...
这两个库在Java生态系统中扮演着不可或缺的角色,特别是在AOP(面向切面编程)和ORM(对象关系映射)框架中。 CGlib是一个强大的、高性能的代码生成库,它在运行期扩展Java类与实现Java接口。它的核心功能是通过ASM...
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...
在Spring框架中,CGLIB广泛用于AOP(面向切面编程)的实现,特别是在没有接口的情况下。 #### 2.2 使用CGLIB 要使用CGLIB,首先需要引入依赖。在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml ...
在Java中,代理模式的应用非常广泛,特别是在框架级开发中,例如AOP(面向切面编程)中的通知(Advice)、事务管理等方面都离不开代理技术的支持。根据代理对象创建的时间不同,代理又可分为静态代理和动态代理两种...
CGLIB,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界里被广泛应用,尤其是在Spring框架中。CGLIB是基于ASM(一个底层的Java字节码操作和分析框架)来实现的,它允许开发者在运行时...
它在许多场合下被用作Java动态代理的实现,特别是在AOP(面向切面编程)框架中,如Spring AOP。CGlib是基于ASM库的一个封装,使得开发者能够更容易地操作字节码,从而在运行时创建新的类或者增强现有类的功能。 ...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。CGLIB是由Evan Schoolnik开发并维护的,它最初是作为Jakarta OGNL...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,实现在调用原有方法前后添加额外的功能,如日志记录、事务管理、性能监控等。Java提供了两种主要的动态...
CGLib,全称为Code Generation Library,是一个强大的Java字节码操作库,广泛应用于动态代理、AOP(面向切面编程)以及性能优化等领域。它允许开发者在运行时创建和增强新的类或对象,而无需编写任何Java源代码。...
AspectJ 是一种基于Java语言的面向切面编程框架,它提供了一种更加强大的AOP实现方式。AspectJ支持在编译期或运行期注入切面,允许开发者更加精细地控制通知(Advice)的执行时机和位置。与JDK动态代理和CGLIB相比,...
总的来说,CGLib作为一个强大的字节码生成库,广泛应用于AOP(面向切面编程)、ORM框架(如Hibernate)、测试工具(如Mockito)等领域,提供了对Java类的灵活扩展和控制。正确理解和使用CGLib,能极大地提升开发效率...
总结来说,CGGLIB 2.2.2 和 ASM 3.3.1 是两个关键的Java开发工具,它们提供了字节码级别的操作能力,广泛应用于AOP框架、动态代理和类增强。了解并熟练使用这两个库,可以显著提升Java开发者的技能水平和解决问题的...
CGlib,全称为Code Generation Library,是一个强大的Java代码生成库,广泛用于动态代理、AOP(面向切面编程)框架以及性能优化等场景。它通过字节码技术为类创建子类,从而实现对目标类的功能增强。在Java中,由于...
Cglib是一个强大的、高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。Cglib3.3.0是该库的最新版本,提供了两个jar包:`cglib-3.3.0.jar`和`cglib-nodep-3.3.0.jar`。 1...
CGlib是许多其他流行框架,如Spring AOP和Hibernate,背后的重要技术之一。 在Java 17及更高版本中,CGlib继续保持其兼容性和稳定性,这表明它已经成功地适应了Java语言的新特性和改进。Java 17作为长期支持(LTS)...
CGlib-nodep-2.1_3.jar 是一个与Java编程相关的库,主要用来扩展Java反射功能,特别是在处理面向切面编程(AOP)时。它是一个无依赖(nodep)版本,意味着它包含了所有必需的类,无需额外导入其他库,如ASM库。这个...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。这个库的主要功能是能够在运行时动态创建类或者增强已有类的功能...