开发者学堂课程【Java 高级编程:CGLIB 实现代理设计模式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/20/detail/395
CGLIB 实现代理设计模式
内容简介:
一. Proxy 类创建代理对象
二.CGLIB 实现代理设计模式
一. Proxy 类创建代理对象
从 Java 的官方来讲已经明确的要求了如果要想实现代理设计模式,那么一定是基于接口的应用,所以在官方给出的 Proxy 类创建代理对象时都需要传递该对象所有的接口信息:
Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
但是这个时候有一部分的开发者就认为不应该强迫性的基于接口来实现代理设计。
比如数据库,官方给出的标准做法是 SQL 语 句,有人认为 SQL 语句不好就不用SQL;如果操作程序开发,现在核心的结构是面向对象,有人认为面向对象不好,因为函数是编程。所以一些开发者就开发出了一个 CGLIB 的开发包,利用这个开发包就可以实现基于类的代理设计模式。
二.CGLIB 实现代理设计模式
1)CGLIB 是一个第三方的程序包,需要单独在 Eclipse 之中进行配置,现在假设程序包的路径为:
D:\jar-lib\cglib-nodep-3.2.6.jar,那么需要打开 Eclipse 项目属性安装第三方开发包;
比如找到程序,找到 properties,再跟上 Java Build Path,选择 Libraries 下的Classpath,选择 Add External JARs 增加一个扩展包,如下图:
然后找到计算机我的电脑的 D 盘,再跟上一个开发包,现在就表示已经可以将第三方的程序包直接拿过来使用了;
这个操作以后会经常见到,因为以后会大量的使用第三方开发包。
2)编写程序类,该类不实现任何接口;
比如现在要做是没有接口的代理设计,所以在这里面找到 message 类, message类在这里就是一个普通的类。Message 没有接口,如果没有接口,操作形式是不可能变为代理设计的,但是 CGLIB 就不要求用接口来实现;
3)利用 CGLIB 编代理类,但是这个代理类需要做一个明确,此时相当于使用了类的形式实现了代理设计的处理,所以该代理设计需要通过 CGLIB 来生成代理对象;
定义一个代理类:
从整体来讲,这个代理的结构跟之前做的操作形式非常相似,唯一的区别是这个代码中没有 proxy。
4)此时如果要想创建代理类对象,则就必须进行一系列的 CGLIB 处理;
不管怎么操作代理操作,它一定要有一个公共的复位,实际上它是通过类的继承来模拟代理过程的,程序代码如下:
执行结果如下:
【消息代理】 进行消息发送通道的链接。
【发送消息】www.mldn.cn
【消息代理】关闭消息通道。
在进行代理设计模式定义的时候除了可以使用接口之外,也可以不受接口的限制而实现基于类的代理设计,但是如果从正常的设计角度来讲,强烈建议还是基于接口的设计会比较合理。
CGLIB 只是传统代理设计上的一种功能的补充。
我们要清楚代理设计模式的基本结构,掌握动态代理,知道 CGLIB 不再强制性与接口绑定从而实现基于类的代理设计模式。