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

Spring AOP原理

目录
  • 1. AOP核心概念
  • 2. 动态代理机制
    • (1)JDK动态代理
    • (2)CGLIB动态代理
  • 3. AOP执行流程
  • 4. 与AspectJ的关系
  • 总结

Spring AOP(面向切面编程)是Spring框架的核心特性之一,它基于动态代理和字节码增强技术实现,能够在不修改原有代码的情况下,为程序添加横切关注点(如日志、事务、安全等)。其核心原理可以从以下几个方面理解:

1. AOP核心概念

  • 切面(Aspect):封装横切关注点的类,包含通知和切入点。
  • 通知(Advice):切面的具体实现(如前置通知、后置通知等)。
  • 切入点(Pointcut):定义通知作用的目标方法(通过表达式匹配)。
  • 连接点(JoinPoint):程序执行过程中可插入切面的点(如方法调用、异常抛出等)。
  • 代理(Proxy):AOP通过代理对象执行目标方法,并在执行前后插入通知逻辑。

2. 动态代理机制

Spring AOP的核心实现依赖动态代理,根据目标类是否实现接口,自动选择两种代理方式:

(1)JDK动态代理

  • 适用场景:目标类实现了接口。
  • 原理:通过java.lang.reflect.Proxy类在运行时动态生成代理类,代理类实现目标接口,并在接口方法中嵌入通知逻辑。
  • 特点:只代理接口中的方法,不代理类中的非接口方法。
// JDK动态代理示例(简化版)
public class JdkProxy implements InvocationHandler {private Object target; // 目标对象public JdkProxy(Object target) {this.target = target;}// 生成代理对象public Object getProxy() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}// 代理逻辑(调用目标方法时执行)@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 前置通知(如日志)System.out.println("方法执行前...");// 执行目标方法Object result = method.invoke(target, args);// 后置通知System.out.println("方法执行后...");return result;}
}

(2)CGLIB动态代理

  • 适用场景:目标类未实现接口。
  • 原理:通过CGLIB(Code Generation Library)在运行时动态生成目标类的子类,并重写目标方法,在子类中嵌入通知逻辑。
  • 特点:可代理类中的所有方法(需注意final方法无法被重写,因此不能被代理)。

3. AOP执行流程

  1. 解析配置:Spring容器启动时,解析AOP相关配置(如@Aspect@Before等注解或XML配置),识别切面、通知和切入点。
  2. 创建代理:对符合切入点匹配的目标类,Spring自动为其创建代理对象(JDK或CGLIB代理)。
  3. 拦截调用:当调用目标方法时,实际执行的是代理对象的方法。
  4. 执行通知:代理对象在目标方法执行前后(或异常时)插入通知逻辑。
  5. 执行目标方法:通知逻辑执行完毕后,代理对象调用原始目标类的方法。

4. 与AspectJ的关系

  • Spring AOP使用了AspectJ的切入点表达式语法(如execution(* com.example.service.*.*(..))),但实现原理不同。
  • AspectJ是基于编译期或类加载期的字节码增强,而Spring AOP是基于运行时的动态代理,更轻量且与Spring容器深度集成。

总结

Spring AOP通过动态代理技术,在不侵入业务代码的前提下,实现了横切关注点的模块化,降低了代码耦合度。其核心是通过代理对象拦截目标方法调用,并在调用过程中织入通知逻辑,从而实现日志记录、事务管理等通用功能的复用。

http://www.hskmm.com/?act=detail&tid=31667

相关文章:

  • Ventoy引导Kali live USB持久化
  • 知识库管理工具深度测评:ONES、Confluence 等10款工具全面对比
  • 好的测试数据管理,到底要怎么做?
  • 【面试题】人工智能工程师高频面试题汇总:循环神经网络篇(题目+答案)
  • 做了个手机上的“视频播放器”,获益匪浅
  • CEF关闭流程
  • AI一周资讯 251005-251015
  • 2025 年中空百叶源头厂家最新推荐排行榜:聚焦国内优质供货商,助力客户精准选购可靠产品光能/光伏/电动/光动中空百叶厂家推荐
  • 2025年学校家具定制厂家最新权威推荐榜:全屋定制/衣柜/厨柜/酒柜/鞋柜/猫柜/酒店办公家具/电视柜/书包柜/图书架/宿舍上下床
  • iOS框架内存中占用很高的ttc文件是否正常
  • Linux配置SSH名称通信
  • MPC模型预测控制:原理、设计与MATLAB实现
  • 2025年焊接变位机厂家最新权威推荐榜:双轴变位机专业制造商,高效稳定助力智能焊接升级
  • 体育视频分析中的计算机视觉技术创新
  • 2025年法兰罩厂家最新权威推荐榜:专业防护与精密制造,工业管道安全守护者优选品牌
  • 2025 年膜结构厂家最新推荐排行榜:含车棚 / 看台 / 景观等产品实力企业盘点与选择指南
  • 题解:qoj7303 City United
  • 多网融合实战指南:4G、Wi-Fi与以太网的智能协同之道
  • 最佳实践:基于Apache SeaTunnel从MySQL同步到PostgreSQL
  • 2025年冲压件厂家最新权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件源头实力解析
  • 完整教程:PaVeRL - SQL:基于部分匹配奖励与语言强化学习的 Text-to-SQL 技术
  • 2025年抖音推广服务商最新权威推荐榜:专业运营团队与高转化率方案深度解析,助力品牌精准引流与爆款打造
  • 基于模糊深度信念网络(FDBN)的情感分析实现与优化
  • 2025年卷板机厂家综合推荐榜:折弯机/液压机厂家助力制造业智能化升级
  • Python 实现 Ping 功能
  • 2025年焊接机器人厂家最新权威推荐榜:激光/自动/智能/工业/国产焊接机器人系统、机器人焊接设备、汽车/钢结构/氩弧焊焊接机器人公司精选
  • 2025年保洁公司最新权威推荐榜单:专业家政服务与深度清洁口碑优选,家庭保洁、企业保洁、开荒保洁全方位解析
  • C语言学习——变量
  • RabbitMQ投递回调机制以及策略业务补偿
  • 2025年大连媒体投放公司最新权威推荐榜:覆盖传统媒体/新媒体/户外广告投放的优质服务商深度解析