代理模式(静态代理、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.mzph.cn/news/658720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot的默认组件扫描

本篇博客主要探究:为什么SpringBoot项目中我们没有配置组件扫描的包,为什么它会默认扫描启动类所在的包? 一、访问与启动类所在同一包下的接口 我们先来看一个简单的接口: 我们可以观察到,HelloController这个类处在…

福布斯财富增长榜前十富豪身价暴增3.5万亿!他们致富的秘诀究竟是?

按照《福布斯》最新的数据显示,今年全球前十位财富增长最多的富豪的身家总共增加了4900亿美元(约3.5万人民币),大家可能对于3.5万亿没什么概念,但是换算一下,中国一共才14亿人,如果把这3.5万亿平…

jenkins部署(docker)

docker部署,避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…

BUUCTF-Real-[PHP]XXE

目录 1、原理 2、XXE漏洞产生的原因 3、开始复现 paylaod 复现 4、flag 1、原理 XML数据在传输过程中,攻击者强制XML解析器去访问攻击者指定的资源内容(本地/远程),外部实体声明关键字SYSTEM会令XML解析器读取数据&#xf…

【Axure教程0基础入门】00Axure9汉化版下载、安装、汉化、注册+01制作线框图

写在前面:在哔哩哔哩上面找到的Axure自学教程0基础入门课程,播放量最高,5个多小时。课程主要分为4个部分,快速入门、动态面板、常用动效、项目设计。UP主账号【Song老师产品经理课堂】。做个有素质的白嫖er,一键三连必…

【C/C++】深入理解--函数重载(什么是函数重载?为什么要有函数重载?)

目录 一、前言 二、 函数重载 🍎什么是函数重载 🍐函数重载的条件 🍇函数重载的注意点 🍉为什么要有函数重载 🍓为何C语言不支持函数重载,反倒C可以? 💦 Linux环境下演示函数重…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统,完全依赖代码进行实现,动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标(x,y) //1秒时间内,移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

基于单片机的烟草干燥温度控制系统设计

摘 要:烟草干燥研究一直备受国内外烟草工作者的重视,在烟草干燥的方法中热风管处理法是利用热空气对流使烟草达到干燥的效果,这样可以控制烟草干燥时的温度,使烟草能够更好更快地干燥,因此温度的检测和控制是很重要的。…

写静态页面——浮动练习

0、效果&#xff1a; 1、html代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>浮动…

C++-类和对象(2)

目录 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 1.对象中包含类的各个成员 ​编辑 2.代码只保存一份&#xff0c;在对象中保存存放代码的地址 ​编辑 3.只保存成员变量&#xff0c;成员函数存放在公共的代码段 ​编辑…

C++进阶(八)红黑树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、红黑树的概念二、红黑树的性质三、红黑树结构四、红黑树的插入操作1、情况一2、情况二3、…

【C++】构造函数和析构函数详解

目录 前言 类中的六个默认成员函数 构造函数 概念 特性 析构函数 概念 特性&#xff1a; 前言 类中的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编…

【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

文章目录 1. 写在前面2. 请求分析3. JS反混淆4. 深度分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

字符串转换const char* , char*,QByteArray,QString,string相互转换,支持中文

文章目录 1.char * 与 const char * 的转换2.QByteArray 与 char* 的转换3.QString 与 QByteArray 的转换4.QString 与 string 的转换5.QString与const string 的转换6.QString 与 char* 的转换 在开发中&#xff0c;经常会遇到需要将数据类型进行转换的情况&#xff0c;下面依…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念&#xff08;了解&#xff09;二、单例模式1. 饿汉模式&#xff08;1&#xff09;概念&#xff08;2&#xff09;模拟实现&#xff08;3&#xff09;优缺点&#xff08;4&#xff09;适用场景 2. 懒汉模式&#xff08;1&#xff09;概念&#xff…

金田金业教你如何看懂国际黄金价格走势图

对于黄金投资者来说&#xff0c;看懂国际黄金价格走势图是至关重要的。通过观察走势图&#xff0c;可以了解金价的实时动态&#xff0c;预测未来的走势&#xff0c;从而做出相应的投资决策。本文将详细解析如何看懂国际黄金价格走势图。 一、国际黄金价格走势图的基本构成 国…

【JavaEE】UDP协议与TCP协议

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

NoSQL数据库简介

NoSQL数据库简介 Brief Introduction to NoSQL Databases By JacksonML 1. 什么是SQL&#xff1f; 在了解NoSQL之前&#xff0c;先简要介绍一下SQL。 SQL是 Structured Query Language&#xff08;结构化查询语言&#xff09;的缩写。 SQL在关系型数据中广泛使用&#xf…

大数据学习之Redis,十大数据类型的具体应用(三)

目录 3.7 Redis位图&#xff08;bitmap&#xff09; 概念 需求 是什么 说明 能干嘛? 基本命令 3.7 Redis位图&#xff08;bitmap&#xff09; 概念 由0和1状态表现的二进制位的bit数组 需求 用户是否登陆过&#xff1f;Y / N 广告是否被点击过&#xff1f; 钉钉打…

深入理解G0和G1指令:C++中的实现与激光雕刻应用

系列文章 ⭐深入理解G0和G1指令&#xff1a;C中的实现与激光雕刻应用⭐基于二值化图像转GCode的单向扫描实现⭐基于二值化图像转GCode的双向扫描实现⭐基于二值化图像转GCode的斜向扫描实现基于二值化图像转GCode的螺旋扫描实现基于OpenCV灰度图像转GCode的单向扫描实现基于Op…