JDK和CGLIB生成动态代理类的区别。
来源:互联网 发布:java或且非符号 编辑:程序博客网 时间:2024/06/02 03:45
关于动态代理和静态代理
当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象。
按照代理对象的创建时期不同,可以分为两种:
静态代理:事先写好代理对象类,在程序发布前就已经存在了;
动态代理:应用程序发布后,通过动态创建代理对象。
静态代理其实就是一个典型的代理模式实现,在代理类中包装一个被代理对象,然后影响被代理对象的行为。
其中动态代理又可分为:JDK动态代理和CGLIB代理。
1.JDK动态代理
此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。
代理模式在实际使用时需要指定具体的目标对象,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道具体类的话,怎样实现代理模式呢?这就引出动态代理。
JDK动态代理只能针对实现了接口的类生成代理。
2.CGLIB代理
CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,
主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。
JDK动态代理和CGLIB代理生成的区别
JDK动态代理只能对实现了接口的类生成代理,而不能针对类 。
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 。
因为是继承,所以该类或方法最好不要声明成final ,final可以阻止继承和多态。
参考代码
CGLIB:
public
Object createProxyObject(Object obj) {
this
.targetObject = obj;
Enhancer enhancer =
new
Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(
this
);
Object proxyObj = enhancer.create();
return
proxyObj;
// 返回代理对象,返回的对象其实就是一个封装了“实现类”的代理类,是实现类的实例。
}
JDK:
public
Object newProxy(Object targetObject) {
// 将目标对象传入进行代理
this
.targetObject = targetObject;
//注意这个方法的参数,后面是类实现的接口
return
Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this
);
// 返回代理对象
}
在代码中可以看到,在生成代理类时,传递的是实现类所实现的接口 targetObject.getClass().getInterfaces(),所以JDK只能对于接口进行做代理。如果换成类的话,则会抛java.lang.ClassCastException异常。
在Spring的源码中,可以看到很多生成代理类的代码。
动态代理的应用
AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(aspect)、通知(advice)、连接点(joinpoint),实现方式就是通过对目标对象的代理在连接点前后加入通知,完成统一的切面操作。
实现AOP的技术,主要分为两大类:
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。
默认的策略是如果目标类是接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理。
如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。
转载:http://www.cnblogs.com/binyue/p/4519652.html
- CGLIB 和 JDK生成动态代理类的区别
- CGLIB 和 JDK生成动态代理类的区别
- CGLIB 和 JDK生成动态代理类的区别
- JDK和CGLIB生成动态代理类的区别
- CGLIB 和 JDK生成动态代理类的区别
- JDK和CGLIB生成动态代理类的区别
- JDK和CGLIB生成动态代理类的区别。
- 动态代理:JDK动态代理和CGLIB代理的区别
- 动态代理:JDK动态代理和CGLIB代理的区别
- 动态代理:JDK动态代理和CGLIB代理的区别
- jdk动态代理和cglib动态代理的区别
- jdk动态代理和cglib动态代理的区别
- java的jdk动态代理和cglib动态代理区别
- jdk动态代理和cglib代理区别
- JDK动态代理和CGLIB代理的区别
- JDK动态代理和CGLIB代理的区别
- Spring之JDK动态代理和cgLib的区别
- Java动态代理机制介绍(jdk和cglib的区别)
- 欢迎使用CSDN-markdown编辑器
- hadoop MapReduce序列化
- 关于@requestMapping跳转页面静态资源无法加载问题
- 《step5:tiny-spring-ioc学习五》——ApplicationContext登场
- apue 函数原型 ---线程
- JDK和CGLIB生成动态代理类的区别。
- 线程:死锁
- 7、线程并发库
- ios AudioUnit 录制播放 pcm
- LeetCode ( Minimum Depth of Binary Tree)
- Kotlin数据类(八)
- JavaScript中i.toString(16)的理解,Number.prototype.toString
- JZOJ 1843——小球
- Java EE之Eclipse简单应用