1、B站链接
B站链接:https://www.bilibili.com/video/BV1M54y1X78p?from=search&seid=12892498772732488811&spm_id_from=333.337.0.0
代码(gitee上):git@gitee.com:jin-nengshuai_admin/java-learn-code.git
2、几个概念
代理
给一个对象A 提供一种代理对象 ,来控制对 A 的访问。
代理对象 作为“替身”,替代了原有对象。
通俗来说,代理即为 代替处理。由 另一个对象来替代原对象,处理某些逻辑。
代理的作用:
-
在不修改原对象代码的基础上,对原对象功能进行 修改或增强。
-
当想给某些对象添加一些额外的逻辑时(例如 访问权限,日志,… ),使用代理模式。我们可以不修改源代码,只针对这些额外的功能进行编码。在整个过程中,原对象的逻辑和额外增加的逻辑完全解耦,互补干扰。
耦合
项目中的各个模块和组件,当一个发生变动和调用的时候,其他模块和组件也跟着发生变动和调用,产生了强烈的联系。
当模块或组件耦合度过高的时候,会带来难以扩展,维护性差,纠错困难等问题。
解耦
削减或消除 耦合度
目标类
原对象 所对应的类。
通过代理对象 来控制对 原对象 的访问,扩展 原对象的功能。
代理类
代理模式产生的对象,是原对象的替身。
在原有对象的基础上,修改逻辑。
3、创建代理对象
3.1、总述
在 Java中,代理有三种方式来创建 代理对象:
- 静态代理 【要么继承目标类;要么实现 目标类已经实现过的 相同接口】
- 基于 JDK(接口) 的动态代理
- 基于 CGLIB(父类) 的动态代理
静态代理:
-
我们会手写代理类的代码。项目中会有 代理类的源码,代理类 会被编译后执行。
-
方法:
- 1、目标类会实现某个接口,代理类会和 目标类 实现相同的接口
- 2、代理类直接继承目标类
-
分析:静态代理完成了解耦。但静态代理类的 代码维护依然非常复杂,一旦接口或者父类发生了变动,则代理类的代码也会随之修改。在代理类多的时候,维护非常麻烦。故在实际开发中,一般使用动态代理的方式。
动态代理:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUAq8jKc-1646466408452)(C:\Users\18234827921\AppData\Roaming\Typora\typora-user-images\image-20220216231457185.png)]
3.2、静态代理
3.3、基于 JDK(接口) 的动态代理
前两个参数:
第三个参数是一个接口,它里面只有一个方法 invoke 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKkdOq6a-1646466408454)(C:\Users\18234827921\AppData\Roaming\Typora\typora-user-images\image-20220304100543720.png)]