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

news/2024/7/6 6:32:35 标签: 代理模式, java, 开发语言

代理模式(静态代理、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 对象
java">@Data
public class Student {
   

    private String name;
    private int age;

}
  • 创建 service 接口定义规范
java">public interface IStudentService {
   

    /**
     * 添加学生
     */
    void save();

    /**
     * 查询学生信息
     * @param id
     * @return
     */
    Student query(Long id);

}
  • 创建实现类,被代理类
java">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;
    }
}
  • 创建事务类对象
java">public class DaoTransaction {
   

    public void before() {
   
        System.out.println("开始事务操作");
    }

    public void  after() {
   
        System.out.println("关闭事务");
    }

}
  • 创建代理类对象
java">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);
    }
}
  • 测试代理类对象
java">public class TestStudent {
   

    @Test
    public void 

http://www.niftyadmin.cn/n/5354602.html

相关文章

基于JAVA+SpringBoot+Vue的前后端分离的美食分享推荐平台2

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 在当今社会&#xff0…

PyTorch动态计算图构建的详细过程和代码

当用户定义了一个继承自 nn.Module 的神经网络模型,并通过调用 model.forward(input) 进行前向传播时,PyTorch 会根据执行的张量操作序列自动构建并维护一个动态计算图,其中的详细过程是: 初始化输入: 用户首先准备输入…

蚁群算法图像边缘提取(MATLAB)

蚁群算法用于图像边缘提取的主要思想和步骤如下: 初始化蚁群:在图像上随机产生一群蚂蚁,定义蚂蚁移动规则和信息素更新公式。 蚂蚁爬行建图:让蚂蚁按照一定概率移动规则在图像上爬行,当蚂蚁爬到边缘时,在该位置留下信息素。重复多次迭代。 信息素更新:根据蚂蚁移动路径和信息…

如何使用 Google 搜索引擎保姆级教程(附链接)

一、介绍 "Google语法"通常是指在 Google 搜索引擎中使用一系列特定的搜索语法和操作符来精确地定义搜索查询。这些语法和操作符允许用户过滤和调整搜索结果,提高搜索的准确性。 二、安装 Google 下载 Google 浏览器 Google 官网https://www.google.c…

springboot第53集:微服务分布式架构,docker-compose,Prometheus,mqtt监控体系周刊

从0搭建一套Prometheus监控体系 简介: Prometheus是一款开源监控系统,起源于SoundCloud的警告工具包。自2012年以来,许多公司和组织开始广泛采用Prometheus。该项目具有活跃的开发人员和用户社区,吸引越来越多的参与者。如今&…

【数据结构 03】循环队列

一、原理 循环队列从功能角度具有队列的性质,即遵从先进先出原则,但是其存储方式是顺序存储。 循环队列的存储空间大小通常都是固定的,通过前指针和尾指针的移动控制循环队列数据的增删。 特征:顺序存储、先进先出、容量有限&a…

c++之说_9_6|自定义类型 struct operator 重载运算符关键字

c中 struct 和 class 特性几乎一模一样 所以很多都是共有的特性 篇幅就很多了 c中 我觉得最牛皮的概念之一 就是 重载运算符 operator 关键字 这个东西 能将 我们的 运算符 (-*/) new delete 类型转换 写在类里面当成员函数 并制定 该类型变…

【云原生】docker-compose单机容器编排工具

目录 什么是docker-compose? 管理区别 docker-compose的三大概念 YAML 文件格式及编写注意事项 使用 YAML 时需要注意下面事项: 布尔值类型 字符串类型 一个key有多个值 对象object类型 文本块 锚点 docker-compose配置模板文件常用的字段 …