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

静态代理和动态代理

静态代理
一、什么是代理(Proxy)?
代理的意思很简单:
“不让你直接找目标对象,而是通过中间人(代理)去访问。”

就像明星不直接接电话,而是通过经纪人(代理人)来沟通。


🧱 二、一个最简单的例子(静态代理)
我们先写一个接口和一个真正干活的类:
 

// 抽象主题(接口)
public interface UserService {void addUser();
}
​
// 真实主题(被代理类)
public class UserServiceImpl implements UserService {@Overridepublic void addUser() {System.out.println(「执行添加用户的逻辑」);}
}

现在我们想在执行 addUser() 之前打印日志。 如果你直接改 UserServiceImpl,就破坏了它的纯净性。

于是我们写一个「代理类」👇

🤵 三、静态代理类实现

// 代理类
public class UserServiceProxy implements UserService {private UserService target; // 持有真实对象的引用
​public UserServiceProxy(UserService target) {this.target = target;}
​@Overridepublic void addUser() {System.out.println(「前置操作:开始记录日志」);target.addUser();  // 调用目标对象的方法System.out.println(「后置操作:操作成功」);}
}

🚀 四、使用

public class Test {public static void main(String[] args) {UserService userService = new UserServiceImpl();UserService proxy = new UserServiceProxy(userService);
​proxy.addUser();}
}

动态代理(将接口代理出去,实现这个接口的调用方法,都会执行代理内部的方法)
动态代理的核心就是在内存中动态生成一个代理类,这个类实现了指定接口,所有方法调用最终都会转发到 InvocationHandler 的 invoke() 方法中。
“定义一个接口 → 动态生成代理类实现接口 → 通过反射执行 SQL 并返回结果”
在手写 mybatis-plus 源码中如何实现
定义一个通用接口,这个接口里面有增删改查泛型,然后里面的所有都会被代理
然后的话先把继承这个接口的都进行代理,这样内部调用的方法都会通过调用反射的 SQL 来实现
核心方法
loader:类加载器,用来加载生成的代理类;
interfaces:要实现的接口(比如 UserMapper);
h:你的回调处理器,实现了 InvocationHandler 接口。
 

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
}

阶段做的事技术点 1️⃣ 接口定义定义 BaseMapper<T>泛型接口 2️⃣ 获取代理 getMapper(UserMapper.class)JDK 动态代理 3️⃣ 调用方法调用 selectById()反射调用 invoke()4️⃣ 解析方法找到对应 SQL 映射反射+缓存 5️⃣ 执行 SQL

阶段做的事技术点
1️⃣ 接口定义定义 BaseMapper<T>泛型接口
2️⃣ 获取代理getMapper(UserMapper.class)JDK 动态代理
3️⃣ 调用方法调用 selectById()反射调用 invoke()
4️⃣ 解析方法找到对应 SQL 映射反射+缓存
5️⃣ 执行 SQL调用 JDBC 执行 SQLSQLSession
6️⃣ 封装结果将结果封装为 T 类型泛型+反射

调用 JDBC 执行 SQLSQLSession6️⃣ 封装结果将结果封装为 T 类型泛型+反射

更多技术专题资料:scan_material_yinke0020

http://www.dtcms.com/a/491907.html

相关文章:

  • 深度学习论文: Pixel-Perfect Depth with Semantics-Prompted Diffusion Transformers
  • uni-app学习笔记(二)
  • 中国网站设计师广州最专业的网站建设
  • 怎么查看网站的ftp地址wordpress 文章引用
  • 基于JETSON+FPGA+GMSL相机 vs 传统工业相机:高动态范围与低延迟如何重塑机器感知视觉?
  • 物联网开发学习总结(5)—— 深入对比 TDengine、InfluxDB 和 TimescaleDB 三大主流时序数据库的性能表现
  • 网站pv统计方法深圳logo设计公司哪家好
  • 软件测试— 测试分类
  • 三井物产商品预测竞赛思路
  • 各省住房和城乡建设厅网站南宁公司做seo
  • 网站如何建数据库淘宝建设网站的理由
  • 网站建站建设价格怎么开通自己的微信小程序
  • 网站用户界面设计宁波网站建设服务商
  • 笔试强训(五)
  • 网站建设服务合同印花税做任务赚q红包的网站
  • 多媒体在网站开发的分析安装wordpress 500
  • Flask框架网站
  • 工业视觉网关:RK3576赋能多路检测与边缘AI
  • 鞋帽网站欣赏wordpress 文章公开编辑
  • 茂名营销网站开发室内设计学校大专
  • 网站备案 申请给网站写教案做课件一节课多少钱
  • 项目信息版本混乱,该如何统一
  • 使用Mathematica对Duffing方程进行非线性分析
  • 企业微信公众平台企业网站怎么搜索优化
  • Maya python重命名工具
  • 阜阳建设网站公司电话国内做进口的电商网站
  • 深入浅出 AES 加密算法与 Go 语言实战
  • 酒店网站htmlwordpress导航悬浮
  • 分布式与长序列attention
  • 南京做网站群的公司怎么免费开网站