代理到底是什么 (两种动态代理区别)

代理模式是什么?

代理模式是常用的结构型设计模式之一。 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

java种代理分为: 静态代理和动态代理。 动态代理又可以由两种方式来实现: jdk动态代理、cglib动态代理

静态代理:

写一个增强类实现 被增强类实现的所有接口,需要把被增强类的引用获取到

前提条件:

①必须知道要增强的接口 【可以不知道实现类,但必须知道接口】

②必须能够获取被增强类 引用

缺点:

①如果接口中的无关方法过多,浪费大量时间去实现很多无关方法【解决:①动态代理②继承已经有的包装类】

②必须有接口!

③不灵活,需要创建 增强类

优点:①执行效率高

JDK动态代理:

前提条件:

①必须知道要增强的接口

②必须用Proxy.newProxyInstance创建代理对象

③动态代理只能增强接口中定义的方法

动态代理实现原理: 用动态代理其实是重新生成了一个代理类, 这个代理类和原类 实现了同样的接口。

两种动态代理区别,代理是经销商吗

JDK Proxy 生成对象的步骤如下: ​ 1、拿到被代理对象的引用,并且获取到它的所有的接口,反射获取。 ​ 2、JDK Proxy 类重新生成一个新的类、同时新的类要实现被代理类所有实现的所有的接 口。 ​ 3、动态生成 Java 代码,把新加的业务逻辑方法由一定的逻辑代码去调用(在代码中体 现)。 ​ 4、编译新生成的 Java 代码.class。 ​ 5、再重新加载到 JVM 中运行。

cglib动态代理:

CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)

CGLib 动态代理执行代理方法效率之所以比 JDK 的高是因为 Cglib 采用了 FastClass 机制,它的原理简单来说就是:为代理类和被代理类各生成一个 Class,这个 Class 会为代理类或被代理类的方法分配一个 index(int 类)。这个 index 当做一个入参,FastClass就可以直接定位要调用的方法直接进行调用,这样省去了反射调用,所以调用效率比 JDK动态代理通过反射调用高。

两种动态代理的区别?

CGLib 和 JDK 动态代理对比

1. JDK 动态代理是实现了被代理对象的接口,CGLib 是继承了被代理对象。 ​ 2.JDK 和 CGLib 都是在运行期生成字节码,JDK 是直接写 Class 字节码,CGLib 使用 ASM框架写 Class 字节码,Cglib 代理实现更复杂,生成代理类比 JDK 效率低。 ​ 3.JDK 调用代理方法,是通过反射机制调用,CGLib 是通过 FastClass 机制直接调用方法, CGLib 执行效率更高。

spring 中的动态代理

Spring 利用动态代理实现 AOP 有两个非常重要的类,一个是 JdkDynamicAopProxy 类和 CglibAopProxy 类。

两种动态代理区别,代理是经销商吗

Spring在选择用JDK还是CGLiB的依据:

(1)当Bean实现接口时,Spring就会用JDK的动态代理

(2)当Bean没有实现接口时,Spring使用CGlib是实现

(3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)

大家好,我是小劲,专注分享java知识点,如有总结不到位的,欢迎小伙伴指点。感谢大家阅读,欢迎点赞、转发...