您的位置:首页 > 编程语言 > Java开发

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

2017-07-23 22:40 281 查看
动态代理目前实现的方式有两种:JDK动态代理、CGLib动态代理

首先来说一下第一种:JDK动态代理

JDK 1.3之后,Java提供了动态代理技术,允许开发者在运行期间创建接口的代理实例。在Sun刚推出动态代理时,还很难想象他有多大的用途,现在我们终于发现动态代理是实现AOP(面向切面编程)的绝好底层技术。

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。

demo:在PrintHelloWorld的printHw方法前执行一句代码,方法后执行一句代码。

接口:PrintHelloWorld.java



接口实现类:PrintHelloWorldImpl.java



代理类:MyProxy.java



测试类:TestMyProxy.java



测试结果:



接下来说一下第二种:CGLib动态代理

使用JDK动态代理有一个限制,即它只能为接口创建代理实例,这一点我们可以从Proxy的接Proxy.newProxyInstance(target.getClass().getClassLoader(),

target.getClass().getInterfaces(),myProxy)方法签名中可以看出:第二个入参interfaces就是需要代理实例实现的接口列表。虽然面向接口编程的思想被很多大师级人物很推崇,但在实际开发中,开发者对此深感困惑:难道对一个简单业务表的操作也需要老老实实的创建5个类(领域对象类、Dao接口、Dao实现类、Service接口、Service实现类)吗?

对于没有通过接口的定义业务方法的类,如何通过动态代理创建代理实例呢?JDK的代理技术显然已经黔驴技穷,CGLib作为一个替代者,填补了这一空缺。

CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类的调用。

demo:

PrintHelloWorldImpl.java



代理类:CglibProxy.java



测试类:TestCglibProxy.java



测试结果:



这里要注意的是:引入cglib-nodep-2.2.jar,不要再引入cglib.jar,会造成jar包冲突。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息