当前位置: 首页 > news >正文

从源码中学习动态代理模式

动态代理模式

        动态代理是 Java 反射(Reflection)API 提供的一种强大机制,它允许在运行时创建对象的代理实例,而不需要在编译时静态地创建

        Java 提供了两种主要的方式来实现动态代理:

  1. 基于接口的动态代理:使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口。
  2. 基于类的动态代理:通常使用第三方库如 CGLIB(Code Generation Library)。

如何实现动态代理

        

  1. 定义接口:首先,需要一个或多个接口,这些接口定义了代理对象需要实现的方法

  2. 实现 InvocationHandler:创建一个实现了 InvocationHandler 接口的类。这个类的 invoke 方法会在代理对象的每个方法被调用时执行。

  3. 创建代理实例:使用 Proxy.newProxyInstance 方法(也可以其他方式创建代理实例)在运行时动态创建代理对象。这个方法接收三个参数:

    • 一个 ClassLoader,用于定义代理类;
    • 一个接口数组,指定代理对象需要实现的接口;
    • 一个 InvocationHandler 实例,用于处理代理对象的方法调用。
  4. 调用代理方法当代理对象的方法被调用时,invoke 方法会被触发,你可以在这个方法中添加自定义逻辑,如日志记录、权限检查等。

  5. 执行目标方法:在 invoke 方法内部,可以通过反射调用实际对象的方法。如果有需要,还可以在调用前后添加额外的逻辑。

源码案例解读

        在Mybatis框架中的MapperProxy类,就使用了动态代理技术。它首先实现了InvocationHandler接口。

        InvocationHandler 类是JDK反射包中的一个接口方法,它定义了一个invoke接口方法。通常就是通过反射来实现。

        MapperProxy实现了InvocationHandler 接口,并重写了invoke方法,从它的代码实现逻辑中,我们可以看到,实际是调用了Method的invoke方法,也即通过传入的Class/Method参数,使用反射技术,实现方法调用。

        再者,类似于Proxy.newProxyInstance 方法,MapperProxyFactory提供了创建代理实例的方法

        然后,在MapperRegistry类的getMapper方法中,我们发现;通过传入被代理对象的Class类,我们可以得到上述的MapperProxyFactory,进而可以得到代理对象MapperProxy。

        最后,根据上述流程,当我们调用代理方法时,就会根据Class对象、Method方法,最总通过上述的一系列调用传递,最终通过反射来实现动态代理调用。

http://www.lryc.cn/news/450689.html

相关文章:

  • 谷歌浏览器完美清除缓存
  • 《如何高效学习》
  • 阿里云ACP认证考试题库
  • 学习经验分享【38】YOLOv11解读——最新YOLO版本
  • 电商选品/分析| 亚马逊常见插件爬虫实战之-helium插件
  • 遇到慢SQL、SQL报错,应如何快速定位问题 | OceanBase优化实践
  • postgresql僵尸进程的处理思路
  • Springboot 练习
  • ISA-95制造业中企业和控制系统的集成的国际标准-(3)
  • MATLAB中图形导出功能的详细使用指南
  • 助农小程序|助农扶贫系统|基于java的助农扶贫系统小程序设计与实现(源码+数据库+文档)
  • SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
  • git clone或repo init 时报错:fatal: 协议错误:错误的行长度 xxx
  • SpringBoot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递 文件上传)
  • 成都网安周暨CCS2024 | 大模型安全与产业应用创新研讨活动成功举办
  • React 解释常见的 hooks: useState / useRef / useContext / useReducer
  • telnet发送邮件教程:安全配置与操作指南?
  • 超强大的 Nginx 可视化管理工具
  • Android 安装应用-提交阶段之后剩下的操作
  • buuctf [ACTF2020 新生赛]Include
  • JS使用MutationObserver接口来监听DOM的更新
  • 图解C#高级教程(三):泛型
  • 240930_CycleGAN循环生成对抗网络
  • ide 使用技巧与插件推荐
  • 【node】 cnpm|npm查看、修改镜像地址操作 换源操作
  • 大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!
  • IDE 使用技巧与插件推荐全面指南
  • java-快速将普通main类变为javafx类,并加载自定义fxml
  • 数据结构之——单循环链表和双向循环链表
  • Git Stash: 管理临时更改的利器