Spring AOP 源码探索 之 链式调用中的 ExposeInvocationInterceptor拦截器作用

news2024/10/7 7:28:46

文章目录

    • ExposeInvocationInterceptor
      • 示例代码
      • 源码分析
        • extendAdvisors
        • makeAdvisorChainAspectJCapableIfNecessary
      • 添加扩展拦截器的调用链
      • 作用示例
    • 总结
  • 相关学习路线
    • JAVA资深架构师成长路线->开源框架解读->Spring框架源码解读

ExposeInvocationInterceptor

从英文名字,顾名思义,暴露调用器的拦截器。
其就是起了暴露一个调用器作用的拦截器。

  • 1、那么其暴露了什么调用器?
  • 2、是如何暴露的,通过什么方法实现?
  • 3、暴露给谁?
  • 4、在什么时候起到拦截作用?

下面带着以上问题,通过示例代码来分析spring Aop源码

示例代码

Spring AOP 源码探索 之 示例代码

源码分析

extendAdvisors

在初始化完Bean,调用AbstractAutoProcxyCreator的后置处理方法postProcessAfterInitialization的时候,对adivisors进行了扩展,添加了ExposeInvocationInterceptor拦截器
在这里插入图片描述

makeAdvisorChainAspectJCapableIfNecessary

实际添加了ExposeInvocationInterceptor拦截器的地方
作者英文注释:

/**
* Add special advisors if necessary to work with a proxy chain that contains AspectJ advisors.
* This will expose the current Spring AOP invocation (necessary for some AspectJ pointcut matching)
* and make available the current AspectJ JoinPoint. The call will have no effect if there are no
* AspectJ advisors in the advisor chain.
* @param advisors Advisors available
* @return {@code true} if any special {@link Advisor Advisors} were added, otherwise {@code false}.
*/

在这里插入图片描述

添加扩展拦截器的调用链

方法栈图示
在这里插入图片描述
完整方法栈

makeAdvisorChainAspectJCapableIfNecessary:44, AspectJProxyUtils (org.springframework.aop.aspectj)
extendAdvisors:97, AspectJAwareAdvisorAutoProxyCreator (org.springframework.aop.aspectj.autoproxy)
findEligibleAdvisors:90, AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy)
getAdvicesAndAdvisorsForBean:70, AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy)
wrapIfNecessary:346, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
postProcessAfterInitialization:298, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsAfterInitialization:421, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1635, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:481, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
main:11, SilasMainClass (org.silas)

作用示例

在代理对象调用方法时起作用。
Spring AOP 源码探索 之 方法栈及链式调用解读

调用链首先调用此ExposeInvocationInterceptor拦截器的invoke方法,将MethodInvocation mi 设置到
ThreadLocal invocation 里面
在这里插入图片描述
以后置通知(@After)拦截器的invoke为例
org.springframework.aop.aspectj.AspectJAfterAdvice#invoke
在这里插入图片描述
在调用通知方法invokeAdviceMethod的时候传了一个参,参数通过调用getJoinPointMatch()方法获得。
在这里插入图片描述
看下getJoinPointMatch()方法源码
在这里插入图片描述
ExposeInvocationInterceptor.currentInvocation()方法
从ThreadLocal invocation 里面取出了
前面通过ExposeInvocationInterceptor实例对象set进去的mi
在这里插入图片描述

总结

那么从上面的AspectJAfterAdvice#invoke方法例子可以知道,ExposeInvocationInterceptor就是用来传递MethodInvocation的。在后续的任何下调用链环节,只要需要用到当前的MethodInvocation就通过ExposeInvocationInterceptor.currentInvocation()静态方法获得。

相关学习路线

JAVA资深架构师成长路线->开源框架解读->Spring框架源码解读


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系列P5】gccg++与【动静态库】的美妙邂逅

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

exe的python文件打包

【步骤01】 【在命令行中用pip工具安装Pyinstaller模块】 pip install Pyinstaller 步骤02】 【切换命令行的路径到你要打包的Python源文件的文件夹路径下】 【下面是我要打包的Python源文件&#xff08;散点坐标图.py&#xff09;及其文件夹路径】 【步骤03】 【执行Pyi…

js使用replace保留两位小数,正则保留小数位,输入负数和小数正则自动校验

下面是方法,支持保留自定义小数位&#xff0c;这里使用的是截取&#xff0c;没有四舍五入&#xff0c;我的功能需求是只有两位小数的地方可以输入负数&#xff0c;所以只加在了num2的代码块里&#xff0c;如果你们需要所有数字都进行负号校验&#xff0c;可以吧if (isF)判断放在…

百度智驾,与车路协同说「再见」

作者 | 魏启扬 来源 | 洞见新研社 在经历了裁员&#xff0c;全员停发年终奖之后&#xff0c;百度对智能交通事业部&#xff08;ACE&#xff09;的治理还在继续。 不久前&#xff0c;有媒体爆料称&#xff0c;百度已经将智能交通事业部&#xff08;ACE&#xff09;从原来的智能…

smart Java——Netty实战(下):开发一个仿WeChat聊天工具SmartChat

文章目录 〇、代码逻辑一、搭建Server1.引入依赖2.搭建一个简单的Server 二、搭建WebSocket建立连接1.修改Server&#xff0c;增加一些支持2.自定义一个WebSocketHandler 三、功能实现——用户注册上线1.先定义一个工具类Result&#xff0c;用于封装服务端返回消息2.封装客户端…

easyX库图像处理相关函数(注释版)

0.图像处理相关函数与类型概览 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来的是easyX的图像处理相关接口。 如果您感兴趣也可以看看我的其他内容。 函数或数据类型描述IMAGE保存图像的对象。loadimage读取图片文件。putimage在当前绘图设备上绘制指定图像…

高压线路距离保护程序逻辑原理(三)

阻抗元件的主要程序功能是阻抗计算&#xff0c;即第二章的解微分方程算法。配合低通数字滤波器计算出故障点至保护安装处的感受电抗X和电阻R值&#xff0c;再同整定值比较以确定是否在区内。阻抗元件也可以采用其他算法计算阻抗&#xff0c;但应指出上述哪种计算感受电抗和电阻…

如何去伪存真高效挖掘用户真实需求?2大模型

用户需求描述模糊&#xff0c;不清晰&#xff0c;往往对项目造成不可估量的风险&#xff1a;需求理解错误、新增需求、变更需求等问题&#xff0c;从而影响项目按时交付。 那么如何更准确地描述用户需求&#xff0c;就显得尤为重要。而可行性较强的模型主要有两种&#xff1a;5…

Django纪录操作之增删改查

一、单表 1、 添加记录 准备表 from django.db import modelsclass Book(models.Model):title models.CharField(max_length20)price models.DecimalField(max_digits65,decimal_places5)publish models.CharField(max_length30)pub_date models.DateTimeField(auto_now…

阿里云盘如何实现 大文件 秒上传?

文章目录 Intro极速上传的原因隐私保护 Intro 今天把几个软件上传到阿里云盘进行分享&#xff0c;文件大小将近1GB&#xff0c;按理说上传需要个2~3分钟吧。 之前上传一个压缩包看到上传速度大概是4~5MB/s。 但是我刚到别的软件看了一圈&#xff0c;回来发现文件居然已经上传…

网络攻防基础(复习)

文章目录 第 1 章 软件与系统安全概述第 2 章 扫描与防御技术2.1 扫描技术概述2.2 常见的扫描技术2.3 扫描工具2.4 扫描的防御 第 3 章 网络监听及防御技术3.1 网络监听概述3.2 监听技术3.3 监听的防御 第 4 章 口令破解与防御技术4.1 口令的历史与现状4.2 口令破解方式4.3 典型…

基于遗传算法(GA)的多旅行商问题(MTSP)

matlab2016b可运行&#xff0c;输入城市位置&#xff0c;可以动态显示规划过程 % MTSPF_GA Fixed Multiple Traveling Salesmen Problem (M-TSP) Genetic Algorithm (GA) % Finds a (near) optimal solution to a variation of the M-TSP by setting % up a GA to search …

前后端分离,通用分页js处理模板

截图&#xff1a; 步骤&#xff1a; 第一步&#xff1a;创建一个index.html引入 <script src"./jquery-3.7.0.js"></script><link rel"stylesheet" href"https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstra…

想要wav转换mp3软件?看我给你分享将wav转换成mp3的软件

你是否曾经遇到过这样的情况&#xff1a;下载了一首你喜爱的音乐&#xff0c;却发现它的格式是wma&#xff0c;无法在你的设备或播放器上正常播放&#xff1f;别担心&#xff0c;今天我将向你介绍几款wma转换器&#xff0c;让你能够轻松转换音频格式&#xff0c;不再困惑于wma转…

Samba协议实现视频上传、远程播放

一、效果演示 扫码打开上传页面&#xff0c;上传进度可以全局筛选订单查看&#xff0c;上传过程中查看视频是本地视频&#xff08;速度快&#xff09;&#xff0c;上传完成后再次打开是smb服务器视频&#xff08;打开慢&#xff09; 本文涉及demo参考下载 二、集成smbj 1、集…

写毕业论文之前一定要看的经验总结!!!

本文为笔者关于毕业论文的经验总结 如果本文有错误的地方 或者关于论文有什么更好的经验分享欢迎私信或者评论指出 打开word的格式标记 打开标尺 摘要 标题 目录 分页 页码 图片 表格 参考文献 打开word的格式标记 word格式标记并不是真的存在&#xff0c;只是帮你你修改word时…

嵌入式工作的前景:为什么嵌入式系统需求仍在增长

嵌入式系统的需求在过去几十年中一直稳步增长&#xff0c;并且预计在未来仍然会继续增加。嵌入式系统是指嵌入到其他设备或系统中的计算机系统&#xff0c;它们具有特定的功能和任务。这些系统广泛应用于汽车、消费电子产品、医疗设备、智能家居、工业自动化等领域。 随着科技…

Quiz 10: Tuples | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 10: Tuples 单选题&#xff08;1-11&#xff09;编程题Exercise 10.2 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This course aims to teach everyone the basics of programming computers using Python. 本课…

【软件测试】Java+selenium环境搭建

目录 1.下载Chrome浏览器&#xff0c;查看浏览器的版本 2.根据浏览器版本下载驱动 根据电脑版本下载驱动&#xff1a; 3.去maven仓库寻找selenium驱动 4.在idea中创建一个项目 1.在pom.xml中添加依赖 2.点击右侧刷新按钮 3.在Java下创建一个类Main 4.将以下代码写入 5.…

B061-ES6 NodeJS npm Vue

目录 ECMAScript6什么是ECMAScriptECMAScript历史语法申明变量解构表达式箭头函数模块化 npm引出nodejs安装VUEvue简介配置Terminalvue入门vue属性-elvue属性-datavue属性-methods vue架构认识vue表达式vue-表达式-基础vue-表达式-操作对象&数组 vue-指令v-text & v-ht…