news 2026/11/4 1:58:05

AOP动态代理详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AOP动态代理详解

JDK动态代理

AccountService proxy = Proxy.newProxyInstance(...) │ │ proxy 是内存中自动生成的一个类 │ 它实现了 AccountService 接口 │ ▼ ┌───────────────────────────────┐ │ $Proxy0(内存中自动生成的类) │ │ │ │ implements AccountService { │ │ │ │ InvocationHandler handler; │ ← 持有调用处理器 │ │ │ Account deposit(...) { │ │ return handler.invoke( │ ← 每次调用都走 handler │ this, method, args │ │ ); │ │ } │ │ │ │ Account withdraw(...) { │ │ return handler.invoke( │ │ this, method, args │ │ ); │ │ } │ │ │ │ } │ └───────────────────────────────┘ │ 调用 proxy.deposit(1, 5000) │ ▼ handler.invoke(proxy, deposit方法, [1, 5000]) │ ┌───────────┼───────────────┐ │ │ │ ▼ ▼ ▼ Before target.deposit() After 通知 (目标方法) 通知

CGLIB代理

AccountService(原始类) │ │ CGLIB 创建一个子类继承它 │ ▼ AccountService$$EnhancerByCGLIB(自动生成的子类,也就是代理) │ │ 继承了 AccountService │ 重写了所有非 final 方法 │ └── deposit(Integer id, Double amount) { │ ├── Before 逻辑 │ ├── super.deposit(id, amount) ← 调用父类(原始类)的方法 │ ├── After 逻辑 │ └── return result; } 关键区别: - JDK代理:代理和目标对象是"兄弟"关系(实现同一接口) - CGLIB代理:代理和目标对象是"父子"关系(代理继承目标类)

对比

┌─────────────────┬──────────────────────┬──────────────────────┐ │ │ JDK 动态代理 │ CGLIB 代理 │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 前提条件 │ 目标类必须实现接口 │ 不需要接口 │ │ │ │ 目标类不能是 final │ │ │ │ │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 实现方式 │ 实现相同接口 │ 继承目标类 │ │ │ 代理是目标的"兄弟" │ 代理是目标的"儿子" │ │ │ │ │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 核心API │ java.lang.reflect │ net.sf.cglib.proxy │ │ │ .Proxy │ .Enhancer │ │ │ .InvocationHandler │ .MethodInterceptor │ │ │ │ │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 调用方式 │ method.invoke( │ methodProxy. │ │ │ target, args) │ invokeSuper( │ │ │ │ obj, args) │ │ │ │ │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 生成的类名 │ com.sun.proxy │ AccountService │ │ │ .$Proxy0 │ $$EnhancerByCGLIB │ │ │ │ $$xxxxx │ │ │ │ │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 性能 │ 创建快,调用稍慢 │ 创建慢(生成子类) │ │ │ │ 调用快(直接调父类) │ │ │ │ │ ├─────────────────┼──────────────────────┼──────────────────────┤ │ │ │ │ │ 局限性 │ 只能代理实现了接口 │ 不能代理 final 类 │ │ │ 的类 │ 不能代理 final 方法 │ │ │ │ │ └─────────────────┴──────────────────────┴──────────────────────┘ Spring 怎么选择? - Spring 5.x 默认使用 CGLIB(即使目标类实现了接口) - Spring Boot 2.x 开始默认也是 CGLIB - 原因:CGLIB 不需要接口,使用更方便 - 可以通过配置强制使用 JDK 代理:@EnableAspectJAutoProxy(proxyTargetClass = false)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 1:55:20

解密云原生AI助手:Hermes Agent的微服务编排与容器化实战策略

解密云原生AI助手:Hermes Agent的微服务编排与容器化实战策略 在当今云原生技术浪潮中,开发团队面临着一个核心挑战:如何在复杂的微服务架构中高效集成智能AI助手,同时确保安全隔离、资源优化和开发效率?Hermes Agent…

作者头像 李华
网站建设 2026/11/4 1:54:45

AI花生智能变量除草机上位机 Qt信创完整项目(适配大田花生除草工作业)

# AI花生智能变量除草机上位机 Qt信创完整项目(适配大田花生除草工作业) ## 项目简介 **项目名称**:AI花生分生育期变量除草喷雾控制系统(信创国产适配) **技术栈**:Qt5.15+C++、RS485多线程串口、花生专用杂草识别自适应除草算法、SQLite作业台账、QtChart土壤墒情/行进…

作者头像 李华
网站建设 2026/11/4 1:41:34

构建智能物流配送时间预测系统:Hermes Agent机器学习模型

构建智能物流配送时间预测系统:Hermes Agent机器学习模型 在当今快节奏的电商环境中,物流配送效率直接影响客户满意度和企业竞争力。Hermes Agent作为一款强大的AI代理框架,提供了构建智能物流配送时间预测系统所需的核心工具和模块。本文将…

作者头像 李华
网站建设 2026/11/4 1:40:27

构建智能环境控制系统:Hermes Agent节能与舒适度优化全指南

构建智能环境控制系统:Hermes Agent节能与舒适度优化全指南 在当今能源成本不断攀升和环保意识日益增强的时代,构建一个既能降低能耗又能提升生活舒适度的智能环境控制系统成为当务之急。Hermes Agent作为一款强大的开源智能代理框架,提供了…

作者头像 李华