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

相关文章:

  • 杂题选做-12
  • YOLOFuse与火山引擎集成:字节跳动技术生态
  • YOLOFuse限时免费策略:推广期加速用户增长
  • 探索无人机集群编队协同控制的奇妙世界
  • YOLOFuse社区活跃度上升:GitHub Star数周增超200%
  • 在程序员的职业字典里,每次提到“外包”这两个字,似乎往往带着一种复杂的况味,不知道大家对于这个问题是怎么看的?包括我们在逛职场社区时,也会经常刷到一些有关外包公司讨论或选择的求职帖子。的确,在
  • YOLOFuse支持A100吗?超大规模训练实测反馈
  • YOLOFuse量化压缩:INT8与FP16精度损失测试
  • YOLOFuse与Token购买关联:解锁高级功能
  • YOLOFuse与科比特航空:电力巡检红外识别
  • Python 教程:下载网页并将资源改为本地相对路径
  • sti.dll文件损坏丢失找不到 打不开程序 下载方法
  • QT Creator添加OpenCV库即qt引入OpenCV
  • YOLOFuse与智能家居联动:海康威视摄像头对接
  • 深入解析:【Effective Objective-C 2.0】协议与分类
  • YOLOFuse能否识别行人与车辆?城市安防场景测试结果
  • YOLOFuse机房部署规范:多节点集群安装要点
  • YOLOFuse与云从科技协同:国产AI全栈解决方案
  • YOLOFuse博士研究支撑平台:前沿算法验证基座
  • YOLOFuse在农业监测中的应用:夜间作物巡检新方案
  • 关于-CURL-的一切-全-
  • YOLOFuse与碳中和目标:绿色AI节能计算
  • YOLOFuse会员订阅制:月付获取优先技术支持
  • 深耕产教融合沃土,共筑电商人才高地:慧策旺店通与阳光学院达成战略合作
  • YOLOFuse跟踪算法搭配:DeepSORT多目标追踪
  • YOLOFuse训练中断怎么办?断点续训功能使用说明
  • YOLOFuse用户协议说明:禁止用于非法监控用途
  • YOLOFuse javascript数组方法filter筛选高置信度结果
  • 吐血推荐10个AI论文写作软件,继续教育学生轻松搞定毕业论文!
  • 亲测好用9个AI论文平台,MBA论文写作必备!