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

Spring-mvc、Spring-boot中如何在调用同类方法时触发AOP

1. 问题描述

        Spring-mvc和Spring-boot中aop可以实现代理的功能,我们可以借此实现事务和日志记录或者限流等多种操作。但是,如果你在一个方法中调用其同类下的其他方法的时候不会触发AOP。本文主要说明其原因及解决办法和实现原理。

2. 原因

        AIOP的本质是,我们获取代理对象,该对象执行方法的时候,我们对其进行增强操作。例如:下图示例1中bicycle对象执行drive方法的时候,我们对其执行了增强。但是,如果我们在示例2中调用同类的其他方法的时候,本质使用this.drive(),此处的this是真实对象bicycle,而不是代理对象cglibProxy,因而不会进行增强。

3. 解决办法

3.1 直接从spring容器中获取

        参考下图中方法all1,SpringUtils实现代码参考 SpringUtils

3.2 借助Aspectj获取代理对象

        参考下图中方法all2

4. 解析

        SpringUtils直接是创建对象后,在spring容器中管理,便于理解。此处主要解析3.2。在启动类添加@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)后,可以发现在调用spring对象方法之前,会先进入CglibAopProxy中,并将当前spring对象放到ThreadLocal中,使用的时候直接从threadLocal中取即可。相关源码贴图如下。

4.1 org.springframework.aop.framework.CglibAopProxy

4.2 org.springframework.aop.framework.AopContext

5. 总结

        两种方法都是直接获取代理对象,调用目的方法达到方法增强的目的,并且都是相对成熟的实现方案。但是个人更喜欢前者(springUtils获取),原因在于无侵入,且大部分项目都会自定义该工具。后者相对于前者,或多或少存在一点开销。

http://www.lryc.cn/news/293425.html

相关文章:

  • 幻兽帕鲁服务器自动重启备份-python
  • C# Onnx yolov8 水表读数检测
  • 负载均衡下webshell连接
  • Spring面试大全-基础知识01
  • Transformer实战-系列教程4:Vision Transformer 源码解读2
  • cesium-水平测距
  • 【Android-Compose】手势检测实现按下、单击、双击、长按事件,以及避免频繁单击事件的简单方法
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于神经网络的CAN总线负载率优化(续)
  • python爬虫6—高性能异步爬虫
  • 日历功能——C语言
  • GPIO中断
  • springboot完成一个线上图片存放地址+实现前后端上传图片+回显
  • 编程思维与生活琐事的内在关联及其应用价值
  • OSPF排错
  • day07-CSS高级
  • 05 MP之ActiveRecord模式+SimpleQuery
  • git diff查看比对两次不同时间点提交的异同
  • 基于muduo网络库开发服务器程序和CMake构建项目 笔记
  • 前端支持下载模板、导入数据、导出数据(excel格式)
  • 编译Faiss-gpu【InterMKL】C++ 按步骤操作 基本不会有问题的 python原理相同。
  • conn.execute的用法详解
  • GetBuffer() 与 ReleaseBuffer() 使用详解
  • Flink CEP(基本概念)
  • [AIGC] Spring Gateway与 nacos 简介
  • 2024-2-3-复习作业
  • 【如何快速上手Vue.js框架——详细介绍】
  • 1Panel应用推荐:青龙定时任务管理平台
  • BUUCTF-Real-[struts2]s2-013
  • 【实战知识】使用Github Action + Nginx实现自动化部署
  • web前端--------渐变和过渡