代理模式是什么?
代理模式是常用的结构型设计模式之一。 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
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知识点,如有总结不到位的,欢迎小伙伴指点。感谢大家阅读,欢迎点赞、转发...