代理模式是什么?

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

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配置中加入)

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

动态代理和静态代理的区别_代理,是动态和静态的吗?相关推荐

  1. Jsp中的动态INCLUDE和静态INCLUDE的区别?

    其实就是动态包含和静态包含的区别: 1. 两者格式不同,静态包含:<%@ include file="文件" %>,而动态包含 < jsp : include p ...

  2. asp.net之动态页面和静态页面的区别

    asp.net之动态页面和静态页面的区别 当我开始接触web开发的时候,首先学到的是html.css.js这一类网页语言,通过布局可以搭建出一个静态网站,效果也跟我们上网时经常看到的一些网站一样了.于 ...

  3. JSP中动态includ与静态includ的区别

    JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" ...

  4. jsp中动态include与静态include的区别

    JSP中动态INCLUDE与静态INCLUDE的区别 动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" f ...

  5. 学习逆向知识之用于游戏外挂的实现.第二讲,快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别...

    通过游戏外挂,学习逆向技术之快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别 一丶静态基址. 动态基址. 基址的区别 通过上一讲超级马里奥的游戏外挂技术制作.我们学习到了静态基址.以及观看内 ...

  6. 广播动态注册和静态注册的区别

    动态注册和静态注册的区别: 动态注册的广播接收器可以自由的控制注册和取消,有很大的灵活性.但是只能在程序启动之后才能收到广播,此外,不知道你注意到了没,广播接收器的注销是在onDestroy()方法中 ...

  7. 【网站建设大全】网站建设动态网站和静态网站的区别

    文章目录 前言 一.从功能方面来说 二.从对数据的利用上说 总结 前言 网站建设公司提供的网站建设服务是做的网站分为动态网站和静态网站两类.那么动态网站和静态网站之间有什么区别呢? 一.从功能方面来说 ...

  8. 老卫带你学---动态语言和静态语言的区别

    老卫带你学-动态语言和静态语言的区别 1.基本概念 静态语言(强类型语言) 静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型. 例如:C++.Java ...

  9. 动态欧拉角与静态欧拉角的区别

    看了网上好多的讲解,讲的都不是特别清晰,让人有一种很懵懵的感觉,感觉懂了,又貌似没懂的奇怪感觉,读了那么多的水文,大多都是内容差不多,好多文章之中错误百出,都是稍微提了一点,没有详细对比二者的区别,很 ...

最新文章

  1. [导入]TreeView的级联选择(上)
  2. Cambridge hpc
  3. tomcat问题记录-线程池引发的问题
  4. 新手攻略熔炉_【新手攻略】快速入门
  5. IT从业者的迷思与求解之道——座谈会实录摘选
  6. mongodb pv uv ip 统计
  7. ERROR: Could not install packages due to an EnvironmentError: [Errno 13] 权限不够的解决办法
  8. scala yield入门详解
  9. MCMC(MH算法)
  10. css只设置背景图片半透明,css 设置背景色或图片半透明的方法(图文)
  11. matlab的otdr仿真,OTDR仿真分析软件
  12. rssi室内定位算法原理_室内定位常用算法概述
  13. win10安装免安装版的mysql5.7
  14. pytorch模型加密
  15. RabbitMQ之Channel
  16. 基于微信小程序小说图书商城管理系统(微信小程序毕业设计)
  17. c语言模拟自动饮料机,C语言--小程序--简单模拟ATM机
  18. 用最虔诚的心攻克英语!
  19. 刷分区linux,【无聊】Linux下的磁盘分区利器——GParted简明介绍
  20. 21计科一班题单2---题解

热门文章

  1. Unity3D性能优化
  2. UE3采用多进程编译Shader
  3. OpenGL ES Emulator横向比较
  4. 遍历二叉树的基本思路
  5. tf.layers.conv2d_transpose 反卷积
  6. SQL Server 2008 R2数据库镜像部署
  7. JavaEE开发之SpringMVC中的自定义拦截器及异常处理
  8. MBG配置详解及最佳实践
  9. OCA读书笔记(8) - 管理用户安全
  10. inetd -- internet超级服务器