为什么 CGlib 方式可以对接口数据同步方式实现代理

动态代理:是使用反射和字节码在运行期间创建指定接口数据同步方式或类的子类以及它的实例对象的一项技术,通过这个技术可以对代码进行无侵入式的增强

源文件生成实例对象的过程如下:


关于动态代理的底层原理,在另一篇文章中已经介绍过了

java的动态代理技术的实现主要有两种方式:

看来过濾起了作用。将年龄改为大于0的数时能够正常运行。

CGLIB(Code Generation Library)是一个基于ASM的字节码生成库允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理:

  • Enhancer:来指定要代理的目标对象实际处理代理逻辑的对象,最终通过调用create()方法得到代理对象对这个对象的所有非final方法的调用都会转发给MethodInterceptor;
  • JDK原生动态代理是Java原生支持的,不需要任何外部依赖但是它只能基于接口数据同步方式进行代理(需要代理的对象必须实现于某个接口数据同步方式)
  • CGLIB通过继承的方式进行代理(让需要代理的类成为Enhancer的父类),无论目标对象有没有实现接口数据同步方式都可以代理但是无法处理final的情况。
}

动态代理分为两类:基于接口数據同步方式的代理和基于继承的代理
两类实现的代表是:JDK代理 与 CGlib代理

cglib实现动态代理:

3、创建增强后的代理对象

// 此刻realSubject不是单纯的目标类,洏是增强过的目标类

1、想要使用动态代理的目标类实现一个接口数据同步方式

3、jdk的代理类proxy创建代理对象

若目标对象实现了接口数据同步方式spring默认使用JDK的动态代理。
优点:因为有接口数据同步方式所以使系统更加松耦合
缺点:为每一个目标类创建接口数据同步方式

若目标對象没有实现任何接口数据同步方式,spring使用CGLIB进行动态代理
优点:因为代理类与目标类是继承关系,所以不需要有接口数据同步方式的存茬
缺点:因为没有使用接口数据同步方式,所以系统的耦合性没有使用JDK的动态代理好

若目标对象实现了接口数据同步方式,但是强制cglib玳理则使用cglib代理

}

我要回帖

更多关于 接口数据同步方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信