当前位置: 首页 > 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.rkmt.cn/news/21670.html

相关文章:

  • 知识库管理工具深度测评:ONES、Confluence 等10款工具全面对比
  • 从SGD到AdamW:深度学习优化器演进全解析与实践指南
  • 2025 年中空百叶源头厂家最新推荐排行榜:聚焦国内优质供货商,助力客户精准选购可靠产品光能/光伏/电动/光动中空百叶厂家推荐
  • 2025年学校家具定制厂家最新权威推荐榜:全屋定制/衣柜/厨柜/酒柜/鞋柜/猫柜/酒店办公家具/电视柜/书包柜/图书架/宿舍上下床
  • Linux配置SSH名称通信
  • 2025年焊接变位机厂家最新权威推荐榜:双轴变位机专业制造商,高效稳定助力智能焊接升级
  • 2025年法兰罩厂家最新权威推荐榜:专业防护与精密制造,工业管道安全守护者优选品牌
  • 最佳实践:基于Apache SeaTunnel从MySQL同步到PostgreSQL
  • 2025年冲压件厂家最新权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件源头实力解析
  • 2025年抖音推广服务商最新权威推荐榜:专业运营团队与高转化率方案深度解析,助力品牌精准引流与爆款打造
  • C语言学习——变量
  • 显卡参数对算力性能的影响
  • 2025年大连媒体投放公司最新权威推荐榜:覆盖传统媒体/新媒体/户外广告投放的优质服务商深度解析
  • win10自带锁屏壁纸和Windows聚焦壁纸路径
  • WSL2内部挂载NFS共享文件夹
  • 2025 年电力金具厂家最新推荐排行榜:覆盖出口 / 玛钢电力金具 / 联板 / 横担等品类,权威解析优质厂家选择方向
  • 左值,右值和移动语义
  • zerotier自建planet内网穿透详细配置教程 - IT苦行僧
  • legit torrents, legit trackers
  • python 数学计算 32位精度
  • 2025 年床上用品厂家最新推荐排行榜:从老牌实力到新锐创新的品质之选,涵盖批发与婚嫁选购指南
  • 现代C++对象工厂模式实现解析
  • 2025 年射线防护服生产厂家最新推荐排行榜:覆盖 X 射线 / 医用 / 中子射线防护服及防护裙、防护屏等品类,为医疗安检领域精选优质品牌
  • 在 VS Code 中集成 LaTeX 环境并创建第一个文档
  • Ai元人文:思想的归乡——从悟空之眼到未来哪吒
  • C语言的学习——梦开始的地方
  • linux基础—基线加固
  • 池化
  • 深入解析:【Coze】【视频】TK动画视频工作流
  • java学习2小时教程-【小细节】