代理模式简单demo(java)

1、背景

mybatis中使用了大量的代理模式,如果了解了代理的使用,可能会对阅读mybatis源码有事半功倍的效果。所以在空闲的时候整理了下java常见的代理和使用demo。

2、关键点介绍

代理模式本质上的目的是为了增强现有代码的功能,其分为静态代理和动态代理两种。
静态代理,代理类需要运行前编写代码实现。
动态代理,代理类在运行中生成,常用的动态代理实现方式有jdk和cglib。
mybatis中主要是使用动态代理,且实现方式为jdk代理方式。

3、准备一个接口和一个实现类

/*** 基础接口类*/
public interface IShow {public void play();
}
/*** 接口实现类*/
public class ShowImpl implements IShow{@Overridepublic void play() {System.out.println("演示接口");}
}

4、静态代理demo

/*** 代理类*/
public class StaticProxy implements IShow {private IShow show;public StaticProxy(IShow show) {this.show = show;}@Overridepublic void play() {System.out.println("****此处添加被代理对象方法执行前的处理逻辑****");show.play();System.out.println("****此处添加被代理对象方法执行后的处理逻辑****");}public static void main(String[] args) {IShow proxy = new StaticProxy(new ShowImpl());proxy.play();}
}

5、动态代理demo - jdk

/*** jdk动态代理实现类*/
public class JdkDynamicProxy implements InvocationHandler {private Object show;public JdkDynamicProxy(Object show) {this.show = show;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("****此处添加被代理对象方法执行前的处理逻辑****");Object resp = method.invoke(show, args);System.out.println("****此处添加被代理对象方法执行后的处理逻辑****");return resp;}public static void main(String[] args) {IShow show1 = new ShowImpl();IShow proxy = (IShow)Proxy.newProxyInstance(show1.getClass().getClassLoader(), show1.getClass().getInterfaces(), new JdkDynamicProxy(show1));proxy.play();}
}

6、动态代理demo - cglib

cglib需要引入额外的第三方依赖库:

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
public class CglibDynamicProxy  implements MethodInterceptor {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("****此处添加被代理对象方法执行前的处理逻辑****");Object resp = methodProxy.invokeSuper(o, objects);System.out.println("****此处添加被代理对象方法执行后的处理逻辑****");return resp;}public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(ShowImpl.class);enhancer.setCallback(new CglibDynamicProxy());ShowImpl proxy = (ShowImpl) enhancer.create();proxy.play();}
}

可以看到cglib可以直接基于类进行动态代理,而jdk动态代理方式则必须要有接口和实现类才行。

7、总结

本篇文章理论介绍比较少,主要是因为个人不常使用代理,网上介绍的动态代理、静态代理等参差不齐又没法甄别对与错,所以本篇文章只展示代理的一些使用demo。

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

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

相关文章

在qt5中使用XShapeCombineRectangles编译报错

linux x11环境中&#xff0c;在qt5中使用XShapeCombineRectangles去实现鼠标穿透 引用了两个头文件&#xff1a; #include <QX11Info> #include <X11/extensions/shape.h>编译的时候会报错&#xff1a; Desktop_Qt_5_12_12_GCC_64bit-Debug/moc_mainwindow.cpp:8…

等保之道:从基础出发,解密网站防护的重要性

随着数字化时代的推进&#xff0c;网站安全问题日益凸显。网站被攻击不仅会导致信息泄漏、服务中断&#xff0c;还可能损害用户信任和企业声誉。为了更好地解决这一问题&#xff0c;我们需从等保的角度审视网站防护&#xff0c;全面提升网络安全水平。 等保背景 等保&#xff0…

C++作业4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 代码&#xff1a; #include <iostream>using namespace std;class Stu {friend const Stu operator*(const Stu &L,const Stu &R);friend bool operator<(const Stu …

抓取检测(Grasp Dection)

抓取检测 抓取检测被定义为能够识别任何给定图像中物体的抓取点或抓取姿势。抓取策略应确保对新物体的稳定性、任务兼容性和适应性&#xff0c;抓取质量可通过物体上接触点的位置和手的配置来测量。为了掌握一个新的对象&#xff0c;完成以下任务&#xff0c;有分析方法和经验…

智慧工地一体化解决方案(里程碑管理)源码

智慧工地为管理人员提供及时、高效、优质的远程管理服务&#xff0c;提升安全管理水平&#xff0c;确保施工安全提高施工质量。实现对人、机、料、法、环的全方位实时监控&#xff0c;变被动“监督”为主动“监控”。 一、建设背景 施工现场有数量多、分布广&#xff0c;总部统…

Woocommerce Private Store私人商店秘密商城插件,适合批发商店,会员制俱乐部

点击访问原文Woocommerce Private Store私人商店秘密商城插件&#xff0c;适合批发商店&#xff0c;会员制俱乐部 - 易服客工作室 WooCommerce Private Store插件是使 WooCommerce 私有的简单方法。密码保护您的整个 WooCommerce 商店并使其隐藏。 非常适合批发商店、会员制俱…

vue 根据动态生成的form表单的整体的数据回显,赋值及校验和提交

主要负责处理表单数据的展示、编辑和提交&#xff0c;以及与后端接口的交互。&#xff08;处理选择地址、处理单选框选中、设置表单验证、提交表单、校验文件是否上传完成、处理上传文件等&#xff09; 公共调用方法mixins文件 import HCommonPop from "/components/comm…

面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题

面试系列&#xff1a; 面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 文章目录 一、前言二、常见65道非技术面试问题…

九、FreeRTOS之FreeRTOS列表和列表项

本节需要掌握以下内容&#xff1a; 1&#xff0c;列表和列表项的简介&#xff08;熟悉&#xff09; 2&#xff0c;列表相关API函数介绍&#xff08;掌握&#xff09; 3&#xff0c;列表项的插入和删除实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌…

微前端qiankun示例 Umi3.5

主应用配置&#xff08;基座&#xff09; 安装包 npm i umijs/plugin-qiankun -D 配置 qiankun 开启 {"private": true,"scripts": {"start": "umi dev","build": "umi build","postinstall": "…

L1-012:计算指数

⭐题目描述⭐ 真的没骗你&#xff0c;这道才是简单题 —— 对任意给定的不超过 10 的正整数 n&#xff0c;要求你输出 2n。不难吧&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过 10 的正整数 n。 输出格式&#xff1a; 在一行中按照格式 2^n 计算结果 输出 2n…

Nacos多数据源插件

Nacos从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 注意:…

Doccker常用的命令

第一部分&#xff1a;基本Docker命令 docker --version //- 查看Docker版本 docker info //- 查看Docker系统信息 docker help //- 获取Docker命令帮助 docker pull //- 拉取Docker镜像 docker push //- 推送Docker镜像 docker run //- 运行Docker容器 docker ps //- 查看运行中…

c++ day 4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载:分别是-&#xff0c;-&#xff0c;<。 #include <iostream>using namespace std; class Stu {friend const Stu operator-(const Stu &L,const Stu &R);friend bool o…

xxl-job分布式定时任务

1.启动java admin项目注册到nacos 2.启动定时任务微服务注册到定时任务中心 3.在定时任务微服务写bean 4.在http://localhost:8080/xxl-job-admin/joblog?jobId2 任务管理添加任务的bean名字和 cron表达式 //想要得到参数,使用,逗号分隔java来处理,或者使用jackson json转…

当XTS服务遇到切流...

事件回顾 介绍问题前&#xff0c;先介绍两个概念。灰度发布和切流。 灰度发布 灰度发布也叫金丝雀发布。起源是矿井工人发现&#xff0c;金丝雀对瓦斯气体很敏感&#xff0c;矿工会在下井之前&#xff0c;先放一只金丝雀到井中&#xff0c;如果金丝雀不叫了&#xff0c;就代表…

如何获取唐诗三百首中的名句列表接口

唐诗三百首&#xff0c;是中国文学中最为经典的诗歌选集之一&#xff0c;其中涵盖了大量美丽、深刻的诗句&#xff0c;被广泛传诵。有不少文化爱好者希望能够获取这些名句列表&#xff0c;以便深入理解唐诗的内涵和精华。那么&#xff0c;如何获取唐诗三百首中的名句列表呢&…

python使用sox对指定路径下的音频进行重采样

SoX&#xff08;Sound eXchange&#xff09;是一个开源的音频处理工具&#xff0c;它可以用来处理和转换音频文件。SoX支持多种音频格式&#xff0c;包括WAV、MP3、OGG等&#xff0c;并提供了丰富的音频处理功能&#xff0c;如音频格式转换、音频剪切、音频合并、音频增益调整、…

uniapp运行到安卓基座app/img标签不显示

img是html中的标签&#xff0c;他也是一个单标签 image属于服务器控件&#xff0c;是个双标签 问题&#xff1a;uniapp运行到app安卓基座后图片无法显示 原因&#xff1a;自己使用了img标签&#xff0c;而且输入路径无提示&#xff0c;img标签导致图片不显示 解决&#xff…

【华为OD题库-055】金字塔/微商-java

题目 微商模式比较典型&#xff0c;下级每赚100元就要上交15元&#xff0c;给出每个级别的收入&#xff0c;求出金字塔尖上的人收入。 输入描述 第一行输入N&#xff0c;表示有N个代理商上下级关系 接下来输入N行&#xff0c;每行三个数:代理商代号 上级代理商代号 代理商赚的钱…