天天看点

Java动态代理、cglib动态代理

说动态代理,需要先清楚静态代理。所谓静态代理就是程序员提前实现好的代理类,编译后class文件是已经存在的。

实现原理,利用Java代理模式,由一个代理类持有委托类的实例,并实现委托类一样的接口,来实现增强方法的目的。

我们主要用它来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情,甚至根本不去执行这个方法。因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象。比如可以添加调用日志,做事务控制,对方法进行缓存等。

Spring容器代替工厂,Spring AOP代替JDK动态代理,让面向切面编程更容易实现。在Spring的帮助下轻松添加,移除动态代理,且对源代码无任何影响。

本文给出静态代理、JDK动态代理、CGLIB动态代理的三种例子。

一、静态代理

在了解代理模式的情况下看下面的代码,没什么可说的。

二、JDK动态代理

使用JDK动态代理使用到一个Proxy类和一个InvocationHandler接口。

Proxy已经设计得非常优美,但是还是有一点点小小的遗憾之处,那就是它仅支持interface代理(也就是代理类必须实现接口),因为它的设计注定了这个遗憾。

三、CGLIB动态代理

对于上面说到JDK仅支持对实现接口的委托类进行代理的缺陷,这个问题CGLIB给予了很好的补位,解决了这个问题,使其委托类也可是非接口实现类。

CGLIB内部使用到ASM,所以我们下面的例子需要引入asm-3.3.jar、cglib-2.2.2.jar