Java核心设计模式:代理设计模式
一、生活中常见的代理案例
- 房地产中介:客户手里没有房源信息,找一个中介帮忙
- 商品代购:代理者一般有好的资源渠道,降低购物成本(如海外代购,自己不用为了买东西出国)
二、为什么要使用代理
- 对于消费者来说,可以减少成本,只需要关心自己需要的商品,不需要寻找资源
三、代理模式在Java中的应用
- 统一异常处理
-
Mybatis使用了代理
- Spring Aop实现原理
- 日志框架
四、什么是代理模式
1、代理模式(Proxy Pattern):23种设计模式之一,属于结构模式,指的是一个对象本身不做实际操作,而是通过其他对象来得到自己想要的结果
2、意义:目标对象只需要关心自己的实现细节,通过代理对象实现功能的增强,可以扩展目标对象的功能
3、重要思想:不能随便修改源码,如果要修改源码,通过修改代理的方式实现功能的拓展
五、代理的图例释义
以房地产中介为例:

六、Java中代理的实现方式

1、元素组成:
接口,定义行为和规范
被代理类,是目标对象
代理类,做功能增强的
2、静态代理
2.1案例
通过代理模式实现事务操作
2.2实现案例
创建domain(POJO)对象
创建service接口定义规范
创建实现类(impl),被代理类
创建事务对象(前置通知与后置通知)
创建代理类对象(Proxy):实现(implement)接口,访问实现类
创建测试类测试代理类对象
2.3存在的问题
1)不利于代码拓展,比如说接口新添一个抽象方法,所有实现类都需要重新实现
2)代理对象要创建很多,非常不利于代码维护
3、动态代理(重点)
3.1概述:
不改变原有功能代码的前提下,动态的实现方法的增强
3.2JDK动态代理
3.2.1基础准备
- 创建POJO类
package cn.yxcode.domain;
import lombok.Data;
// Lombok是一个Java库,能自动插入编辑器并构建工具简化Java开发。
// 通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量。
// 添加该插件请在pom.xml中进行配置
//创建学生类
@Data
public class Student {private String name;private int age;
}
- 创建service接口
-
public interface IstudentService{/***添加学生*/void save();/***查询学生信息*@param id*@return*/Student query(Long id); } - 创建service实现类(需要代理的类)
package cn.yxcode.sevice.impl;
//创建service实现类(需要代理的类)
import cn.yxcode.sevice.IstudentService;
import cn.yxcode.sevice.cn.Student;public class StudentServiceimpl implements IstudentService {@Overridepublic void save() {System.out.println("保存学生信息");}@Overridepublic Student query(Long id) {System.out.println("查询操作");Student student=new Student();student.setName("yx");student.setAge(20);return student;}
}
- 增强类(也叫做切面类)
package cn.yxcode.transaction;
//增强类
public class DaoTransaction {public void before(){System.out.println("开启事务操作");}public void after(){System.out.println("关闭事务");}
}
3.2.2实现InvocationHandler接口
InvocationHandler接口:用来做方法拦截
package cn.yxcode.handle;import cn.yxcode.sevice.IstudentService;
import cn.yxcode.transaction.DaoTransaction;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;//创建处理事务的一个类
public class TransactionHandle implements InvocationHandler {
//InvocationHandler接口:用来做方法拦截/*** proxy:可以通过newPoxyinstance创建代理实例* Method:执行目标方法,invoke方法执行* args:参数数组*/
// 增强类对象private DaoTransaction transaction;
// private IstudentService istudentService;由于未来开发不止一个service所以用Object代替效果
// 需要代理的对象private Object obj;public TransactionHandle(DaoTransaction transaction,Object obj){this.transaction=transaction;this.obj=obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object ret=null;// 判断当前方法是否为save,是才做事务操作if ("save".equals(method.getName())){transaction.before();ret= method.invoke(obj,args);transaction.after();}else {ret= method.invoke(obj,args);}return ret;}
}
3.2.3测试实现
package cn.yxcode;
import cn.yxcode.domain.Student;
import cn.yxcode.handle.TransactionHandle;
import cn.yxcode.sevice.IstudentService;
import cn.yxcode.sevice.impl.StudentServiceimpl;
import cn.yxcode.transaction.DaoTransaction;
import org.junit.Test;import java.lang.reflect.Proxy;public class TestStudent {@Testpublic void testSave(){
// 增强类对象(前置通知和后置通知)DaoTransaction transaction =new DaoTransaction();
// 目标执行类(即接口和实现类)IstudentService service= new StudentServiceimpl();
// 方法拦截处理器TransactionHandle handle= new TransactionHandle(transaction,service);
// 获取代理实例对象IstudentService ProxystudentService=(IstudentService) Proxy.newProxyInstance(StudentServiceimpl.class.getClassLoader(),StudentServiceimpl.class.getInterfaces(),handle);ProxystudentService.save();Student query=ProxystudentService.query(1);System.out.println("查询信息成功,姓名为:"+query.getName()+", 年龄为:"+query.getAge());}
}
//newProxyInstance(类加载器,目标类所实现的所有接口 ,方法拦截器实现方法的增强)
效果

七、总结
JDK动态代理的实现机制:
通过实现接口,通过反射机制获取接口里的方法,并且自定义InvocationHandler接口,实现 方法拦截
回调方式:调用invoke方法实现增强
使用场景:目标类有接口实现,但是能用jdk尽量用(没有的话用CGLIB动态代理的方式,暂时未学后续补上)
效率:1.8高于CGLIB代理机制
相关文章:
Java核心设计模式:代理设计模式
一、生活中常见的代理案例 房地产中介:客户手里没有房源信息,找一个中介帮忙商品代购:代理者一般有好的资源渠道,降低购物成本(如海外代购,自己不用为了买东西出国) 二、为什么要使用代理 对…...
JSP编程
JSP编程 您需要理解在JSP API的类和接口中定义的用于创建JSP应用程序的各种方法的用法。此外,还要了解各种JSP组件,如在前一部分中学习的JSP动作、JSP指令及JSP脚本。JSP API中定义的类提供了可借助隐式对象通过JSP页面访问的方法。 1. JSP API的类 JSP API是一个可用于创建…...
【Flink入门修炼】1-1 为什么要学习 Flink?
流处理和批处理是什么? 什么是 Flink? 为什么要学习 Flink? Flink 有什么特点,能做什么? 本文将为你解答以上问题。 一、批处理和流处理 早些年,大数据处理还主要为批处理,一般按天或小时定时处…...
刘谦龙年春晚魔术模拟
守岁共此时 代码 直接贴代码了,异常处理有点问题,正常流程能跑通 package com.yuhan.snginx.util.chunwan;import java.util.*;/*** author yuhan* since 2024/02/10*/ public class CWMS {static String[] num {"A", "2", &quo…...
re:从0开始的CSS学习之路 9. 盒子水平布局
0. 写在前面 过年也不能停止学习,一停下就难以为继,实属不应 1. 盒子的水平宽度 当一个盒子出现在另一个盒子的内容区时,该盒子的水平宽度“必须”等于父元素内容区的宽度 盒子水平宽度: margin-left border-left padding-lef…...
【MySQL基础】:深入探索DQL数据库查询语言的精髓(上)
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. DQL1.1 基本语法1.2 基础查询1.3 条件查询1.3 聚合函数 🌤️ 全篇…...
JavaScript实现轮播图方法
效果图 先来看下效果图,嫌麻烦就不用具体图片来实现了,主要是理清思路。(自动轮播,左右按钮切换图片,小圆点切换图片,鼠标移入暂停轮播,鼠标移出继续轮播) HTML 首先是html内容&am…...
Web课程学习笔记--jsonp的原理与简单实现
jsonp的原理与简单实现 原理 由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数&…...
第78讲 修改密码
系统管理实现 修改密码实现 前端 modifyPassword.vue: <template><el-card><el-formref"formRef":model"form":rules"rules"label-width"150px"><el-form-item label"用户名:&quo…...
Docker 容器网络:C++ 客户端 — 服务器应用程序。
一、说明 在下面的文章中, 将向您概述 docker 容器之间的通信。docker 通信的验证将通过运行 C 客户端-服务器应用程序和标准“ping”命令来执行。将构建并运行两个单独的 Docker 映像。 由于我会关注 docker 网络方面,因此不会提供 C 详细信息。…...
Android 识别车牌信息
打开我们心爱的Android Studio 导入需要的资源 gradle //开源车牌识别安卓SDK库implementation("com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3")button.setOnClickListener(v -> {Log.d("Test", "");try (InputStream file getAs…...
C#在窗体正中输出文字以及输出文字的画刷使用
为了在窗体正中输出文字,需要获得输出文字区域的宽和高,这使用MeasureString方法,方法返回值为Size类型; 然后计算输出的起点的x和y坐标,就可以输出了; using System; using System.Collections.Generic; …...
二十、K8S-1-权限管理RBAC详解
目录 k8s RBAC 权限管理详解 一、简介 二、用户分类 1、普通用户 2、ServiceAccount 三、k8s角色&角色绑定 1、授权介绍: 1.1 定义角色: 1.2 绑定角色: 1.3主体(subject) 2、角色(Role和Cluster…...
【PTA|期末复习|编程题】数组相关编程题(一)
目录 7-1 乘法口诀数列 (20分) 输入格式: 输出格式: 输入样例: 输出样例: 样例解释: 代码 7-2 矩阵列平移(20分) 输入格式: 输出格式: 输入样例: 输出样例: …...
[office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享
怎么在Excel2003菜单栏自定义一个选项卡 怎么在Excel2003菜单栏自定义一个选项卡 ①启动Excel2003,单击菜单栏--工具--自定义。 ②在自定义界面,我们单击命令标签,在类别中选择新菜单,鼠标左键按住新菜单,拖放到菜单栏…...
面试 JavaScript 框架八股文十问十答第六期
面试 JavaScript 框架八股文十问十答第六期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)use strict是什么…...
【Web】小白友好的Java内存马基础学习笔记
目录 简介 文件马与内存马的比较 文件马原理 内存马原理 内存马使用场景 内存马分类 内存马注入方式 这篇文章主要是概念性的,具体技术细节不做探究,重点在祛魅。 简介 内存马(Memory Shellcode)是一种恶意攻击技术&…...
Rust猜数字游戏
Rust进阶:猜数字游戏 Rust是一门现代的系统级编程语言,注重内存安全、并发性能以及表达力。在这篇博客中,我们将深入介绍一个更加复杂的猜数字游戏代码,展示Rust语言的一些高级特性。 代码示例 以下是一个升级版的Rust猜数字游…...
.gitlab-ci.yml文件参数配置和使用
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
Go语言从基础到高级-目录
一、编程入门和Go语言简介 什么是编程和为什么要学习编程计算机编程的基本概念Go语言简介为什么选择Go语言 二、设置Go语言开发环境 如何安装Go语言设置环境变量Go语言的工作空间配置 三、Go语言基础 Hello, World!初体验变量和常量数据类型(整数、浮点数、字符…...
OLAP] DuckDB : 开源免费的、面向嵌入式场景、列式存储的分析型数据库
0 序 DuckDB 是近期非常火的一款 AP 数据库,其独特的定位很有趣。甚至有数据库产品考虑将其纳入进来,作为分析能力的扩展。 考虑到项目中一个数据处理场景,就此调研一二。 DuckDB 的爆火,也给所有盲目追逐“大数据”的技术人敲响…...
千问3.5-2B镜像实战:免conda/pip安装,网页端直接调用内置视觉语言模型
千问3.5-2B镜像实战:免conda/pip安装,网页端直接调用内置视觉语言模型 1. 镜像介绍与核心能力 千问3.5-2B是Qwen系列中的轻量级视觉语言模型,专为图片理解和文本生成任务优化。这个预置镜像的最大特点是开箱即用——无需任何conda或pip安装…...
OpenCV实战:图像亮度、对比度与锐化的智能调节与优化
1. 图像处理基础概念解析 在开始动手实践之前,我们需要先理解几个关键概念。亮度、对比度和锐化这三个参数就像调节电视画面的三个旋钮,每个旋钮都会对图像产生独特的影响。 亮度(Brightness)就像房间里的灯光开关。调高亮度&…...
smart-mqtt v1.5.4发布,认证能力大升级
smart-mqtt v1.5.4正式发布,此次版本聚焦企业级连接认证能力升级,推出全新高级认证插件,在高性能底座上补齐企业级接入能力,还公布了获取方式与未来规划。版本核心亮点v1.5.4重点通过advanced-auth-plugin让连接认证更适配企业真实…...
如何在5分钟内开始使用Ivy Wallet:新手入门教程
如何在5分钟内开始使用Ivy Wallet:新手入门教程 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-wallet …...
AI驱动的科研绘图革命:DeTikZify如何终结图表代码的手动时代
AI驱动的科研绘图革命:DeTikZify如何终结图表代码的手动时代 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 当deadline遇上绘图难题&a…...
保姆级教程:用Docker Compose一键部署Dify AI平台(附国内镜像加速与端口冲突解决)
零门槛部署Dify AI开发平台:Docker Compose全流程指南与避坑手册 在AI应用开发领域,快速搭建一个稳定可靠的开发环境往往是项目成功的第一步。Dify作为一款面向开发者的AI应用开发平台,通过可视化编排和低代码方式大大降低了构建基于大语言模…...
Wan2.2-I2V-A14B效果对比:LSTM时序预测辅助下的动态剧情生成
Wan2.2-I2V-A14B效果对比:LSTM时序预测辅助下的动态剧情生成 1. 引言 想象一下,当你输入一段文字描述,AI不仅能生成对应的视频,还能像专业导演一样把控剧情节奏和情感起伏。这正是Wan2.2-I2V-A14B结合LSTM时序预测技术带来的突破…...
让老旧Mac焕发新生:OpenCore Legacy Patcher完整指南
让老旧Mac焕发新生:OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您的Mac是否被苹果官方"抛弃"&…...
AI 卖课博主年赚 120 万?原本我想打假,算完账我破防了
AI 卖课博主年赚 120 万?原本我想打假,算完账我破防了 大家好,我是马彪。 昨天晚上刷到一个博主,说自己一年赚了120万,其中90万来自卖课,才5万粉丝。我想这不扯淡呢吗,肯定又是吹牛想割韭菜。 现…...
