代理模式(静态代理、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 {
   

    @Test
    public void 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/359718.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化器刺客之limit 1--Order by col limit n 代价预估优化探索

一、现象 order by 排序加了limit后更慢了? test# explain analyze select userid from dba_users where username like %aaaaaaaaaaaaaaaaaa% order by userid ;QUERY PLAN --------------…

OpenMIPS用verilog实现

一、前期准备 1. 编辑、编译、仿真工具 用vscodeiveriloggtkwave组合实现verilog的编写、编译和波形查看,其配置过程见博主:Macbook M1使用vscodeiveriloggtkwave实现Verilog代码的编译与运行-CSDN博客​​​​​​​​ ​ ​​​​ 文章浏览阅读1.6k次…

深入理解TCP网络协议(2)

目录 1.TCP的状态转换 1.1 LISTEN状态和ETABLISHED状态 ​编辑2.TIME_WAIT 和 CLOSE_WAIT 2.滑动窗口 1.TCP的状态转换 我们通过上图可以看到TCP状态转换的详细过程.在实际开发的过程中,我们不需要了解的这么细致.为了方便大家的理解,我挑几个主要的状态来给大家聊一下 1.…

MySQL库表操作 作业

题目: 1. sql语句分为几类?2. 表的约束有哪些,分别是什么,设置的语法分别是什么?3. 做出班级表,学生表的E-R图,数据库模型图,以及核心的sql语句. 1. MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中,SQL语句主要可以划分为以下几类: > DD…

CentOS gui 图形界面显示文字乱码

一、现象 CentOS(CentOS 7.5)控制台下显示中文乱码: 或者通过X11 Forwarding远程显示CentOS的图形化程序文字乱码: 二、解决方法 安装中文语言包: yum install kde-l10n-Chinese 注:网上有些文章会推荐安…

最小化安装BCLinux-for-Euler-21.10-dvd-x86_64-230731版

本文记录最小化安装BCLinux-for-Euler-21.10-dvd-x86_64-230731版。 一、镜像获取 1、下载镜像 移动云官方网站 最新镜像为2023-11-02 15:04:56更新的BCLinux-for-Euler-21.10-dvd-x86_64-230731版 直接下载地址:https://mirrors.cmecloud.cn/bclinux/oe21.10/I…

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入…

excel中提取一串数字中的某几个数字

excel中提取一串数字中的某几个数字 提取一串数字中的某几个数字,使用公式函数截取数据 LEFT函数:用于截取单元格左边的字符,例如“LEFT(A1,5)”会返回A1单元格中的前5个字符。RIGHT函数:用于截取单元格右边的字符,例…

华为云codeArts使用操作流程

一、开启服务 什么是华为云CodeArts? 本实验将在华为云CodeArts平台上搭建一个凤凰商城开发项目,并完成需求管理、代码仓库、代码检查、编译构建、发布、部署、流水线等软件开发操作。 1)新建项目 进入华为云“控制台”,鼠标移动到页面左侧菜…

【鸿蒙】大模型对话应用(二):对话界面设计与实现

Demo介绍 本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。 DecEco Studio版本:DevEco Studio 3.1.1 Release HarmonyOS SDK版本:API9 关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 对话页…

Mac下手动源码编译安装Swig

使用Homebrew安装 这个方式最简单,但是一般都是安装的最新版: brew install swig如果按照特定版本,需要看一个当前支持的列表: brew search swig brew install swig3源码编译安装 swig依赖pcre库,需要先安装pcre …

一文掌握SpringBoot注解之@Component 知识文集(8)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

Nginx 本地部署vue项目

1、 下载 Nginx 稳定版本 2、下载安装后,打开 nginx.conf配置文件 3、找到打包好的文件,并配置运行文件 文件的位置 root C:/server/build location /{root C:/server/build;index index.html index.htm;#解决刷新后nginx报404问题try_files $uri …

redis复习笔记05(小滴课堂)

案例实战之注册登录-图形验证码谷歌开源Kaptcha引入 验证码配置工具类。 验证码存储Redis逻辑编码实战 工具类用于获取本机ip和md5加密,直接使用就行,我们这里主要是学习redis不是学习这个。 获取验证码并存到redis中的接口: 运行测试&…

聚焦AI新动能,九州未来与燧弘华创签约!

1月24日,厦门市电子信息与人工智能产业高质量发展大会成功举办。来自电子信息产业、人工智能领域的企业家、专家等近300位嘉宾齐聚一堂,共谋智能基础,共话产业合作,共享发展商机。 会上,九州未来与燧弘华创签署算力租…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇,我们介绍了Tomcat提供服务的整体结构,本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能: 处理 Socket 连接,负责网络字节流与…

详解SpringCloud微服务技术栈:深入ElasticSearch(1)——数据聚合

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch实战(旅游类项目) 📚订阅专栏&#x…

Docker容器引擎镜像创建

目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统&#xff08…

【DB2 流浪之旅】 第一讲 Linux 环境安装 db2 数据库

DB2数据库是IBM开发的一种大型关系型数据库平台。它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据。一般DB2是搭配IBM Power系列小机使用的,兼容性好、性能高。当然DB2也有Linux版本的,相对性能会差一些,主要…

大创项目推荐 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…