news 2026/8/21 22:54:37

Spring AOP原理简析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AOP原理简析

在 AspectJ用法 里介绍了 spring AOP 的用法。这里以切面LogAspect的生效流程,简单分析下SpringAOP原理。

切面LogAspect 定义如下:

@Aspect @Component public class LogAspect { @Before(value = "execution(String org.example.topic.aop.demo.StudentServiceImpl.*(String))") public void logBeforeProceed(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); List<Object> args = Arrays.asList(joinPoint.getArgs()); String output = String.format("LogAspect.logBefore: methodName=%s, args=%s", methodName, args); System.out.println(output); }

LogAspect类是 Spring AOP(面向切面编程)的一个典型应用,其工作原理涉及 Spring 容器的 Bean 生命周期、代理机制以及 AOP 的织入过程。


1.@Aspect 和 @Component 的作用

@Aspect @Component public class LogAspect { ... }
  • @Component:告诉 Spring 容器这是一个普通的 Spring Bean,Spring 会在启动时通过组件扫描(如@ComponentScan)将其注册为一个 Bean。
  • @Aspect:表明这个类是一个切面(Aspect),即包含通知(Advice)和切点(Pointcut)的逻辑单元。Spring AOP 会特别处理带有@Aspect注解的 Bean。

✅ 所以LogAspect本身就是一个 Spring 管理的 Bean,并且被识别为切面。


2.切点(Pointcut)定义

@Before(value = "execution(String org.example.topic.aop.demo.StudentServiceImpl.*(String))")

这是一个前置通知(Before Advice),其切点表达式含义如下:

  • execution(...):匹配方法执行连接点。
  • String:返回类型必须是String
  • org.example.topic.aop.demo.StudentServiceImpl.*:目标类是StudentServiceImpl,任意方法名(*)。
  • (String):方法参数必须是单个String类型。

✅ 这个切点会匹配StudentServiceImpl中所有返回String、接受一个String参数的方法。


3.Spring 如何创建代理(Proxy)

Spring AOP 是基于代理模式实现的。当容器发现某个 Bean 需要被 AOP 切面增强时,会为其创建一个代理对象,而不是直接返回原始 Bean。

3.1 代理类型选择:
  • 如果目标类(如StudentServiceImpl实现了接口,Spring 默认使用JDK 动态代理(基于接口)。
  • 如果目标类没有实现接口,Spring 会使用CGLIB 代理(通过继承目标类生成子类)。

📌 假设StudentServiceImpl没有实现接口,Spring 会用 CGLIB 生成一个StudentServiceImpl$$EnhancerBySpringCGLIB子类作为代理。

3.2 代理的作用:
  • 当你从 Spring 容器获取StudentServiceImpl的 Bean 时,实际拿到的是代理对象
  • 调用代理对象的方法时,会先经过 AOP 拦截器链(包括你的@Before通知),再调用原始方法。

4.AOP 织入(Weaving)过程

在 Spring 容器启动过程中,会执行以下关键步骤:

  1. Bean 扫描与注册

    • LogAspect@Component注册为 Bean。
    • StudentServiceImpl也被注册为 Bean(假设它也有@Service@Component)。
  2. BeanPostProcessor 处理
    Spring 使用AnnotationAwareAspectJAutoProxyCreator(一个特殊的BeanPostProcessor)来处理 AOP:

    • 它会扫描所有@AspectBean(如LogAspect)。
    • 分析其中的切点表达式。
    • 检查其他普通 Bean(如StudentServiceImpl)是否匹配这些切点。
  3. 创建代理

    • 如果StudentServiceImpl匹配LogAspect中的切点,AnnotationAwareAspectJAutoProxyCreator会在postProcessAfterInitialization阶段替换原始 Bean 为代理对象
  4. 方法调用时的拦截

    • 当你调用studentService.someMethod("hello")时:
      • 实际调用的是代理对象的方法。
      • 代理对象内部会构建一个拦截器链(Interceptor Chain)
      • 首先执行logBeforeProceed(因为是@Before)。
      • 然后调用原始StudentServiceImpl的目标方法。

5.JoinPoint 的作用

public void logBeforeProceed(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); List<Object> args = Arrays.asList(joinPoint.getArgs()); ... }
  • JoinPoint是 AOP 中的“连接点”,代表程序执行过程中的一个点(如方法调用)。
  • Spring AOP 会自动将当前方法调用的上下文(方法名、参数等)封装到JoinPoint对象中,并传入通知方法。

6. 流程总结

Spring 启动 ↓ 扫描 @Component → 注册 LogAspect 和 StudentServiceImpl 为 Bean ↓ AnnotationAwareAspectJAutoProxyCreator 发现 @Aspect ↓ 解析切点表达式:execution(String StudentServiceImpl.*(String)) ↓ 检查 StudentServiceImpl 是否匹配 → 是! ↓ 为 StudentServiceImpl 创建代理(JDK/CGLIB) ↓ 容器中注入的是代理对象 ↓ 调用 studentService.xxx("arg") ↓ 代理拦截 → 执行 LogAspect.logBeforeProceed(JoinPoint) ↓ 输出日志 ↓ 调用原始 StudentServiceImpl.xxx("arg")

补充说明

  • 仅对 Spring Bean 有效:AOP 只对 Spring 容器管理的 Bean 生效。如果new StudentServiceImpl()手动创建对象,AOP 不会生效。
  • 代理限制:CGLIB 无法代理final方法;JDK 代理只能代理接口方法。
  • 性能:AOP 通过动态代理实现,有一定开销,但通常可忽略。

通过以上机制,LogAspect就能在不修改StudentServiceImpl代码的情况下,透明地在方法调用前插入日志逻辑,体现了 AOP 的“横切关注点”分离思想。

7. 相关文档

1. AspectJ用法: https://blog.csdn.net/taotiezhengfeng/article/details/149515395

2. .Spring AOP切点表达式的关键词梳理: https://blog.csdn.net/taotiezhengfeng/article/details/155744545

3. HandlerInterceptor 与 AOP 对比:https://blog.csdn.net/taotiezhengfeng/article/details/155452970

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 5:14:57

华为云相较于其他友商的优势!

华为云相较于其他云服务提供商&#xff0c;具备以下优势 1.**技术自主性** **自主研发**:华为云基于自研芯片(如鲲鹏、昇腾)和操作系统(如鸿蒙、欧拉)&#xff0c;确保技术自主可控&#xff0c;减少对外部技术的依赖。**全栈技术能力**:提供从芯片到云服务的全栈解决方案&#…

作者头像 李华
网站建设 2026/8/21 18:45:32

Ascend C高性能LayerNorm融合算子开发实战

目录 &#x1f4cb; 摘要 &#x1f3d7;️ 技术原理 2.1 架构设计理念解析&#xff1a;CANN的异构计算哲学 2.2 核心算法实现&#xff1a;从数学公式到硬件指令 2.3 性能特性分析&#xff1a;从理论算力到实际吞吐 &#x1f527; 实战部分 3.1 完整可运行代码示例 3.2 …

作者头像 李华
网站建设 2026/8/20 9:52:54

MIL-STD-1553B总线仿真应用解析

1553B总线协议 1553B总线介绍 MIL-STD-1553B&#xff08;GJB 289A&#xff09;是一种应用于机载电子设备间通信的共享式总线通信协议&#xff0c;以总线式拓扑结构连接最多31个终端设备互联&#xff0c;传输速率为1Mbps&#xff0c;在航空电子总线网络中占有重要地位&#xff…

作者头像 李华
网站建设 2026/8/19 21:27:50

震惊!云服务器选错损失千万,这3家专业机构必须知道!

震惊&#xff01;云服务器选错损失千万&#xff0c;这3家专业机构必须知道&#xff01; 在数字化转型浪潮席卷各行各业的今天&#xff0c;云服务器已成为企业运营不可或缺的数字基石。然而&#xff0c;一个看似简单的选择背后&#xff0c;可能隐藏着巨大的商业风险。从数据安全…

作者头像 李华
网站建设 2026/8/21 2:10:06

34、跨平台文件操作与系统提醒工具使用指南

跨平台文件操作与系统提醒工具使用指南 在日常的计算机使用中,我们常常会遇到跨平台文件操作以及需要系统提醒的场景。本文将详细介绍如何在不同操作系统之间进行文件转换、操作Macintosh磁盘,以及如何利用系统工具进行日期时间显示、日历查看和日程管理等。 1. Macintosh磁…

作者头像 李华
网站建设 2026/8/21 1:24:31

vLLM-Omni发布:高效全模态模型服务框架

vLLM-Omni发布&#xff1a;高效全模态模型服务框架 在大模型从实验室走向千行百业的今天&#xff0c;一个现实问题正困扰着越来越多的企业&#xff1a;如何以合理的成本&#xff0c;稳定地支撑高并发、低延迟的生成式 AI 服务&#xff1f;许多团队发现&#xff0c;即便拥有强大…

作者头像 李华