动态代理的两种实现:JDK动态代理、CGLib动态代理

动态代理目前实现的方式有两种:JDK动态代理、CGLib动态代理
首先来说一下第一种:JDK动态代理
JDK 1.3之后,Java提供了动态代理技术,允许开发者在运行期间创建接口的代理实例。在Sun刚推出动态代理时,还很难想象他有多大的用途,现在我们终于发现动态代理是实现AOP(面向切面编程)的绝好底层技术。
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。
demo:在PrintHelloWorld的printHw方法前执行一句代码,方法后执行一句代码。
接口:PrintHelloWorld.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
接口实现类:PrintHelloWorldImpl.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
代理类:MyProxy.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
测试类:TestMyProxy.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
测试结果:
动态代理的两种实现:JDK动态代理、CGLib动态代理

接下来说一下第二种:CGLib动态代理
使用JDK动态代理有一个限制,即它只能为接口创建代理实例,这一点我们可以从Proxy的接Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),myProxy)方法签名中可以看出:第二个入参interfaces就是需要代理实例实现的接口列表。虽然面向接口编程的思想被很多大师级人物很推崇,但在实际开发中,开发者对此深感困惑:难道对一个简单业务表的操作也需要老老实实的创建5个类(领域对象类、Dao接口、Dao实现类、Service接口、Service实现类)吗?
对于没有通过接口的定义业务方法的类,如何通过动态代理创建代理实例呢?JDK的代理技术显然已经黔驴技穷,CGLib作为一个替代者,填补了这一空缺。
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类的调用。
demo:
PrintHelloWorldImpl.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
代理类:CglibProxy.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
测试类:TestCglibProxy.java
动态代理的两种实现:JDK动态代理、CGLib动态代理
测试结果:
动态代理的两种实现:JDK动态代理、CGLib动态代理
这里要注意的是:引入cglib-nodep-2.2.jar,不要再引入cglib.jar,会造成jar包冲突。