CGLIB(Code Generation Library)是一个开源项目,是一个强大的、高性能、高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口,hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。
CGLIB代理实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的Java字节码编辑类库)操作字节码实现的,性能比JDK强。主要使用于改造遗留系统,这些系统一般不会继承特定的接口。
JDK动态代理与CGLIB动态代理区别
(1)JDK 动态代理
1、只能代理实现了接口的类;
2、没有实现接口的类不能实现JDK的动态代理。
(2)CGLIB动态代理
1、针对类来实现代理的;
2、对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用。
代码实现
cglib动态代理实现需要导入相关包,此处导入的为cglib-nodep-2.2.jar,然后需要创建事务处理器类,并实现MethodInterceptor接口,事务处理器类CglibProxy源码如下:
1 | package com.cjlibproxy; |
有一个火车类,并没有实现接口:
1 | package com.cjlibproxy; |
测试类:
1 | package com.cjlibproxy; |
测试结果:
1 | 代理:开车 |
代码详见 PatternTest
参考资料:
王英豪 与接口相关的设计模式(2):代理模式、标识类型模式及常量接口模式
David 模式的秘密——代理模式