当前位置: 首页 > news >正文

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理)

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理)

  • 一、代理模式概述
    • 1. 生活中的代理案例
    • 2. 为什么要使用代理
    • 3. 代理模式在 Java 中的应用
    • 4. 概述
    • 5. 生活中代理图示
  • 二、代理的实现方式
    • 1. Java 中代理图示
    • 2. 静态代理
      • 2.1 案例
      • 2.2 实现案例
      • 2.3 静态代理存在的问题
  • 三、动态代理
    • 1. 概述
    • 2. JDK 动态代理
      • 2.1 基础准备
      • 2.2 实现 InvocationHandler 接口
      • 2.3 测试
      • 2.4 底层运行原理
    • 3. CGLIB 动态代理
      • 3.1 基础准备
      • 3.2 实现方法拦截 MethodInterceptor
      • 3.3 测试
      • 3.4 底层运行原理
  • 四、总结

一、代理模式概述

1. 生活中的代理案例

  • 房屋中介代理:客户手里没有房源信息,找一个中介
  • 商品代购:这些代购者可以去哪到比较低成本的商品,拥有自己的渠道

2. 为什么要使用代理

对于消费者而言,可以减少成本,只需要关心自己需要的商品,不需要去寻找渠道或者是找房源。

3. 代理模式在 Java 中的应用

  • 统一异常处理
  • MyBatis 使用了代理
  • Spring Aop 实现原理
  • 日志框架

4. 概述

  • 代理模式(Proxy Pattern):是 23 中设计模式中的一种,属于结构型的模式。指一个对象本身不做实际的操作,而是通过其他对象来得到自己想要得到的结果。
  • 意义: 目标对象只需要关心自己的实现细节,通过代理对象来实现功能的增强,可以扩展目标对象的功能。
  • 体现了非常重要的编程思想:不能随便修改源码,通过修改代理的方式来实现功能的扩展。

5. 生活中代理图示

在这里插入图片描述

二、代理的实现方式

1. Java 中代理图示

在这里插入图片描述

  • 元素组成
    • 接口,定义行为和规范的
    • 被代理类,是目标对象
    • 代理类,做功能增强的

2. 静态代理

2.1 案例

通过代理模式实现事务操作

2.2 实现案例

  • 创建 domain 对象
@Data
public class Student {private String name;private int age;}
  • 创建 service 接口定义规范
public interface IStudentService {/*** 添加学生*/void save();/*** 查询学生信息* @param id* @return*/Student query(Long id);}
  • 创建实现类,被代理类
public class IStudentServiceImpl implements IStudentService {public void save() {System.out.println("保存学生信息");}public Student query(Long id) {Student student = new Student();student.setName("sy");student.setAge(18);return student;}
}
  • 创建事务类对象
public class DaoTransaction {public void before() {System.out.println("开始事务操作");}public void  after() {System.out.println("关闭事务");}}
  • 创建代理类对象
public class ProxyStudent implements IStudentService {// 目标类对象private IStudentServiceImpl iStudentService;// 需要做的增强对象private DaoTransaction daoTransaction;// 通过构造器获取目标类和增强类对象public ProxyStudent(IStudentServiceImpl iStudentService, DaoTransaction daoTransaction) {this.iStudentService = iStudentService;this.daoTransaction = daoTransaction;}public void save() {// 开始事务操作daoTransaction.before();// 目标类操作iStudentService.save();// 关闭事务操作daoTransaction.after();}public Student query(Long id) {return iStudentService.query(id);}
}
  • 测试代理类对象
public class TestStudent {@Testpublic void 
http://www.lryc.cn/news/293848.html

相关文章:

  • 【nginx实战】通过nginx实现http 长连接(即keep alive)
  • 通用函数
  • Linux 查看系统信息 + 服务信息命令(简记)
  • 有了Future为什么还要CompletableFuture?
  • Android super.img解包和打包指南(含工具下载lpunpack、lpmake、lpdump)
  • 端到端实现高精地图重建(TopoNet解读和横评)
  • 系统架构20 - 统一建模语言UML(上)
  • 数据库学习笔记2024/2/4
  • Apache POI 处理excel文件 记录用法
  • Transformer实战-系列教程2:Transformer算法解读2
  • python_蓝桥杯刷题记录_笔记_全AC代码_入门3
  • STM32 IIC电量计LTC2944
  • Linux 链接 GitHub 出现 Connection timed out
  • vulnhub靶场之Thales
  • Qt之使用Qt内置图标
  • 《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)
  • Vue引入Axios
  • 【git 本地管理版本及与github合并】 Init Push Pull操作解决方案
  • JavaSE-项目小结-IP归属地查询(本地IP地址库)
  • 使用最大边界相关算法处理文章自动摘要
  • ref和reactive, toRefs的使用
  • 从源代码看Chrome 版本号
  • Vue 图片加载失败处理
  • Quartus IP学习之ISSP(In-System Sources Probes)
  • Vue组件通信讲解[父子组件通信]
  • Qt应用开发(安卓篇)——调用ioctl、socket等C函数
  • centos 安装docker CE
  • 某赛通电子文档安全管理系统 UploadFileList 任意文件读取漏洞复现
  • Kafka运维相关知识
  • 鸿蒙Native项目生产动态库(.so) 和静态库(.a)