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

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.kler.cn/a/230136.html

相关文章:

  • 流媒体中ES流、PS流 、TS流怎么理解
  • 【作业九】RNN-SRN-Seq2Seq
  • 【排版教程】Word、WPS 分节符(奇数页等) 自动变成 分节符(下一页) 解决办法
  • go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
  • Linux进程与资源管理
  • 2024年最新版Java八股文复习
  • 灵活应对:策略模式在软件设计中的应用
  • 析构函数
  • 计算机设计大赛 深度学习+python+opencv实现动物识别 - 图像识别
  • 部署tomcat
  • 【C#】MVVM架构
  • 前端常用代码整理(不断更新中)— js,jquery篇
  • H5 简约四色新科技风引导页源码
  • 基于java+springboot+vue实现的仓库管理系统(文末源码+Lw)23-115
  • 详解MYSQL中的平均值组大小
  • VScode上无法运行TSC命令,Typescript
  • Redis持久化、主从与哨兵架构详解
  • 3、生成式 AI 如何帮助您改进数据可视化图表
  • 【开源】SpringBoot框架开发城市桥梁道路管理系统
  • modelsim仿真使用到vivado的IP,该如何使用!
  • LeetCode541. 反转字符串 II
  • C++单例模式详解
  • Pandas常用操作记录(更新中)
  • 74HC154D-LED
  • Swift Combine 从入门到精通一
  • Python数据可视化库之mplfinance使用详解