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

Spring AOP + 注解执行流程

1. 基本概念

1.1 AOP(面向切面编程)

  • 目的:将横切关注点(Cross-Cutting Concern,如日志、事务、安全、性能监控等)从业务逻辑中分离。

  • 核心概念

    • 切面(Aspect):横切关注点模块,通常使用类 + 注解实现。
    • 切点(Pointcut):定义在哪些连接点(方法、类)执行通知。
    • 通知(Advice):在切点处执行的操作,如 @Before@After@Around
    • 连接点(Join point):程序执行的某个点,如方法调用。
    • 织入(Weaving):把切面逻辑应用到目标对象的过程。

1.2 Spring AOP 特点

  • 基于 代理模式(Proxy)。
  • 默认使用 JDK 动态代理(接口)或 CGLIB 代理(类)。
  • 只能对 Spring 管理的 Bean 起作用。
  • 运行时织入(Runtime),不是编译期。

1.3 注解相关

  • 常用注解:

    • @Aspect:定义切面类。
    • @Before@After@AfterReturning@AfterThrowing@Around:定义通知类型。
    • @Pointcut:定义切点表达式。
  • 自定义注解:

    • 可以自定义注解用于标记方法,再结合 AOP 实现统一处理逻辑。

2. 执行流程原理

Spring AOP + 注解 为例:

2.1 Bean 初始化阶段

  1. Spring 容器启动,扫描 @Component@Service@Repository@Controller 等 Bean。

  2. 扫描 @Aspect 注解的类,注册为切面。

  3. 生成切点信息

    • 解析 @Pointcut 表达式。
    • 解析通知方法及对应切点。
  4. 为匹配切点的 Bean 创建代理对象

    • 如果 Bean 实现接口 → 使用 JDK 动态代理
    • 如果 Bean 是普通类 → 使用 CGLIB 代理
  5. 代理对象替换原始 Bean,注入到 Spring 容器中。

2.2 方法调用阶段

当调用目标方法时(假设方法被注解切面匹配):

  1. 代理拦截调用

    • 代理对象拦截方法调用。
  2. 执行通知链

    • 根据顺序执行通知:

      1. @Before
      2. @Around(前半部分)
      3. 目标方法执行
      4. @Around(后半部分)
      5. @After
      6. @AfterReturning@AfterThrowing(取决于方法是否抛异常)
  3. 返回结果或异常

    • 代理将返回值或异常返回给调用方。

2.3 @Around 的特殊性

  • 可以控制目标方法是否执行。
  • 可以修改参数、返回值。
  • 必须调用 proceed() 执行目标方法,否则方法不会执行。

3. 执行流程示意图

调用方 -> 代理对象 -> 切面通知链 -> 目标方法 -> 返回结果通知顺序(以 @Around + @Before + @AfterReturning 为例):
@Around(前) -> @Before -> 目标方法 -> @Around(后) -> @AfterReturning

4. 注解执行流程分析(以自定义注解为例)

假设有自定义注解 @LogExecution

  1. 定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecution {}
  1. 定义切面:
@Aspect
@Component
public class LogAspect {@Pointcut("@annotation(com.example.LogExecution)")public void logPointcut() {}@Before("logPointcut()")public void before(JoinPoint joinPoint) {System.out.println("方法执行前:" + joinPoint.getSignature().getName());}@AfterReturning(pointcut = "logPointcut()", returning = "result")public void afterReturning(JoinPoint joinPoint, Object result) {System.out.println("方法执行后,返回值:" + result);}@Around("logPointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("环绕前:" + joinPoint.getSignature().getName());Object result = joinPoint.proceed();  // 执行目标方法System.out.println("环绕后:" + joinPoint.getSignature().getName());return result;}
}
  1. 调用方法:
@Service
public class MyService {@LogExecutionpublic String sayHello(String name) {return "Hello " + name;}
}
  1. 执行顺序:
环绕前:sayHello
方法执行前:sayHello
目标方法执行:sayHello
方法执行后,返回值:Hello xxx
环绕后:sayHello

5. Spring AOP 执行流程总结(关键点)

阶段 主要步骤 核心概念
容器初始化 扫描 @Aspect,解析 @Pointcut,创建代理对象 BeanPostProcessor、Proxy
方法调用 代理拦截方法,执行通知链 @Before、@After、@Around 等
目标方法 执行原始业务逻辑 JoinPoint、ProceedingJoinPoint
返回结果 通知链完成后返回结果 返回值或异常处理

6. 注意事项

  1. 自定义注解必须有 RUNTIME 保留期,否则 AOP 无法识别。

  2. AOP 只能拦截 Spring 容器管理的 Bean

  3. 同类内部方法调用不会触发代理(this.method() 不会走代理)。

  4. 优先级

    • @Around > @Before > 目标方法 > @After > @AfterReturning/@AfterThrowing
  5. JDK 动态代理 vs CGLIB

    • 有接口 → JDK 动态代理
    • 无接口 → CGLIB 代理
  6. 异常处理

    • @After 总会执行
    • @AfterReturning 仅在方法正常返回
    • @AfterThrowing 仅在方法抛异常

7. 实战技巧

  1. 统一日志

    • 自定义注解 + AOP → 统一打印方法执行日志。
  2. 性能监控

    • @Around 可计算方法执行耗时。
  3. 事务控制

    • Spring 的 @Transactional 实际上就是 AOP 实现。
  4. 安全校验

    • 可在切面中拦截带特定注解的方法,进行权限校验。
http://www.jsqmd.com/news/177723/

相关文章:

  • YOLOFuse是否涉及C#开发?当前版本基于Python生态构建
  • 自动化毕设 stm32 wifi远程温控风扇系统
  • YOLOFuse轻量化优势显著:2.61MB小模型实现高精度检测
  • YOLOFuse腾讯云插件开发:一键部署功能进行中
  • 什么是 ‘Streaming Middleware’:如何在 Fast API 中实现兼容 LangChain 流式输出的 WebSocket 封装?
  • 杂题选做-12
  • cloudflare使用了环境变量后提示类型“Env”上不存在属性“JWT_SECRET”。解决办法
  • KAT-Coder-Pro V1免费活动继续,免费原来定于北京时间 2025年11月11日 ,快手也加入了模型集成商的队伍了,支持国内各种开原模型 - 教程
  • YOLOFuse性能实测:中期特征融合仅2.61MB,精度高达94.7% mAP@50
  • YOLOFuse与火山引擎集成:字节跳动技术生态
  • Why do we need to use boiling water for cooking?
  • YOLOFuse限时免费策略:推广期加速用户增长
  • YOLOFuse开源许可证类型:MIT许可自由使用
  • GO开发环境搭建
  • YOLOFuse与YOLOv8s性能对比:双流带来精度跃升
  • YOLOFuse红外图像处理技巧:同名配对上传images与imagesIR注意事项
  • 探索无人机集群编队协同控制的奇妙世界
  • YOLOFuse边缘计算部署可行性分析:轻量模型适配嵌入式设备
  • 2026新年选购指南:手持式三维扫描仪十大品牌权威排行榜 - 匠子网络
  • YOLOFuse社区活跃度上升:GitHub Star数周增超200%
  • YOLOFuse Ultralytics框架同步最新版:功能持续更新
  • 慧策集团亮相京深企业合作对话会:以“AI+云”赋能产业高质量发展
  • python昌吉学院学生兼职信息网站vue
  • YOLOFuse与Typora官网无关?警惕搜索引擎误导信息
  • YOLOFuse与滴滴出行:司机疲劳驾驶监测
  • 在程序员的职业字典里,每次提到“外包”这两个字,似乎往往带着一种复杂的况味,不知道大家对于这个问题是怎么看的?包括我们在逛职场社区时,也会经常刷到一些有关外包公司讨论或选择的求职帖子。的确,在
  • YOLOFuse使用指南:快速上手RGB+IR图像融合检测,训练推理全链路支持
  • YOLOFuse与大华股份集成:小区安防升级方案
  • YOLOFuse早期特征融合精度达95.5%,适合小目标检测场景
  • YOLOFuse支持A100吗?超大规模训练实测反馈