面试常问的Spring AOP底层原理

 AOP底层原理可以划分成四个阶段:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段

第一阶段:创建代理对象阶段

  1. 通过getBean()方法创建Bean实例
  2. 根据AOP的配置匹配目标类的类名,判断是否满足切面规则,规则指的是:
    // 切面规则:匹配所有以 "Service" 结尾的类的所有方法
    execution(* com.example.*Service.*(..))
    
  3. 如果满足规则,调用ProxyFactory创建代理Bean并缓存到IoC容器中
  4. 根据目标对象的是否实现接口选择不同的代理策略,通常是JDK Proxy(基于接口的代理)或Cglib Proxy(基于类的代理)

目标对象:就是我们自己写的业务代码

第二阶段:拦截目标对象阶段

  1. 当用户调用目标对象的方法的时候,被一个名为AopProxy的对象拦截
  2. AopProxy对象封装了所有的调用策略,并且实现了IncationHandler接口
  3. 在IncationHandler的invoke()方法中,出发了MethodInvocation的proceed()方法
  4. proceed()方法按照顺序执行符合所有AOP拦截规则的拦截器链

其中invoke() 方法用于定义切面的逻辑,而 proceed() 方法用于在拦截器链中继续执行下一个拦截器或最终执行目标方法

MethodInvocation:负责执行拦截器链,在proceed()方法中执行;

第三阶段:调用代理对象阶段

  1. AOP拦截器链中的每个元素被称为MethodInterceptor,即切面配置中的Advice通知
  2. MethodInterceptor接口的invoke()方法被织入的代码片段
  3. 这些被织入的代码片段在这个阶段执行,通常是切片配置中定义的通知方法

织入代码:就是要在我们自己写的业务代码增加的代码片段;

切面通知:就是封装织入代码片段的回调方法;

负责执行织入的代码片段,在invoke()方法中执行。

第四阶段:调用目标对象阶段

  1. MethodInterceptor接口中的invoke()方法触发对目标对象方法的调用,即反射调用目标对象的方法,例如:
    public class MyInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("Before method execution");// 通过反射调用目标对象的方法Object result = invocation.proceed();System.out.println("After method execution");return result;}
    }
    

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

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

相关文章

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件,希望大家能…

vue中单个页面设置多个上传组件

简述: 在最近的项目中,遇到单页面有多个上传图片的地方,如果每一个上传组件都写一个上传事件,在编码过程中又繁琐,后期维护也麻烦,最终在element-ui中找到了解决方法,在此记录一下。 html代码 …

RisingWave 存储引擎优化:更高的性能与更低的成本

1背景 在「Hummock :专为 RisingWave 流处理而设计的云原生存储引擎」一文中里我们已经介绍了 Hummock 的设计理念与基本架构,本文主要介绍 Hummock 近期几个版本的重大改进与优化 2Fast Compaction 在设计之初,Hummock 的数据文件格式参…

统计linux cpu已使用核心数目

查看cpu核心数 nproc 统计cpu负载 os.getoadavg() 15.09: 过去 1 分钟的平均负载。15.17: 过去 5 分钟的平均负载。15.74: 过去 15 分钟的平均负载。 这些数字表示系统在过去一段时间内的平均负载。平均负载是指在系统中运行或等待运行的进程数。通常,如果这些…

Lua 中的高级特性:模块的使用、字符串模式匹配、高阶函数和表的元方法

### 1. 模块的使用 在 Lua 中,模块是一种封装代码的方式,使得代码可以被重用。下面是一个简单的模块定义和使用的示例: lua -- 定义一个名为 mymodule 的模块 mymodule {} function mymodule.sayHello() print("Hello from my mo…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…

【pytorch框架】使用 PyTorch 进行深度学习

1.Pytorch介绍 PyTorch 是由 Facebook 创建和发布的用于深度学习计算的 Python 库。它起源于早期的库 Torch 7,但完全重写。 它是两个最受欢迎的深度学习库之一。PyTorch 是一个完整的库,能够训练深度学习模型以及在推理模式下运行模型,并支…

阿里巴巴中国站上传图片到1688 API(upload_img-上传图片到1688-1688.upload_img)

随着电子商务的快速发展,越来越多的企业开始利用阿里巴巴中国站平台进行产品推广和销售。为了更好地展示产品,上传图片成为了必不可少的一环。本文将介绍如何使用阿里巴巴中国站API中的upload_img接口上传图片到1688平台,并附上相关的代码示例…

CFD网格中面元和体元几何关系整理

CFD网格中面元和体元几何关系整理 二维图示 三维图示 说明 变量说明备注 X f \bold{X_f} Xf​面元中心 S \bold{S} S面元法向 X P \bold{X_P} XP​Owner体心 X N \bold{X_N} XN​Neighbour体心 X P f \bold{X_{Pf}} XPf​ X f − X P \bold{X_f}-\bold{X_P} Xf​−XP​ X N…

阿里员工自曝:某多多的4轮面试都通过了,但到了谈薪资的环节,被HR为难

HR 的为难 又是一期「排雷心理按摩」,正在密谋年底跳槽的同学需要额外注意。 起源是我看到了这么一篇帖子分享: 一位目前应该还是在职的阿里巴巴的员工,前后花了一个多月的时间,顺利通过了某多多的 4 轮面试。 按道理,…

windows下nginx代理静态资源失效

起因:想把公司网站弄成动静分离的,但是本地代理静态图片一致失效。 1.查看通配符是否正确 2.查看路径是否正确 还有一种可能是我没想到的,nginx进程没关闭掉导致的,属实离谱,我打开任务管理器搜索nginx,…

snmp网管服务MIB Browser使用

MIB Browser 软件打开显示界面,首先需要配置地址、端口号、团体名、snmp版本点击Advanced,弹出配置界面 配置成功后双击走测列表信息就可以查看交换机端口状态、版本号等信息; 例如:我的交换机8号端口是正常,其他端口是…

bash 5.2中文修订1

Bash Features(专题) 本文简要描述了 Bash shell(版本 5.2,2022 年 9 月 19 日)中的功能。 Bash 主页是 http://www.gnu.org/software/bash/ 。 这是 5.2 版,最后更新于 2022 年 9 月 19 日,GN…

蓝桥杯备战——4.继电器/蜂鸣器

1.分析原理图 最好自己先去查查138以及ULN2003的使用方法,我这里直接讲思路。 由上图我们可以看到如果138输入ABC101,则输出Y50,此时若WR通过跳线帽接地则Y5C1 ,于是573(U9)处于输出跟随输入P0状态,此时若P061,则573输出Q71&am…

CPC认证 TEMU出口儿童便携式游泳池ASTM F2666测试标准

便携式游泳池是由PVC加网布制成供儿童和家庭洗澡娱乐的便携式游泳池。简介它和国内的充气水池区别在于,充气水池主要是供儿童钓鱼或摸鱼娱乐而用。所以,业内又叫其为摸鱼池。儿童充气游泳池上架亚马逊出口需要办理CPC认证ASTM F2666标准测试。咨询看首页…

Vue好看的组件库:Element

文章目录 1、什么是Element2、Element快速入门3、Element布局3.1、 Layout 局部3.2、容器布局 1、什么是Element Element:是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页 Element 提供了很多组件(组成网页的部件…

怎么隐藏磁盘或U盘分区?

隐藏分区需求确实存在! 某用户将自己的U盘驱动器分为两个分区,一个是可引导的活动主分区,另一个分区包含服务包和其他用于技术支持的内容,他一直被以下两个问题所困扰: 是否可以隐藏U盘分区? 如果想更改内…

10.docker卷

Docker Volume ​Docker Volume 是 docker的数据卷,用于保持数据持久化。MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,即使删除MySQL容器,数据不会丢失。 MySQL Dockerfile 找到docker hub上的mysql 5…

QEMU搭建arm虚拟机开发环境

获取QEMU代码 git clone https://gitlab.com/qemu-project/qemu.git 切换对应的工程分支 使用git指令切换到对应的分支上,我这里使用的是stable-4.0的分支 git checkout -b stable-4.0 remotes/origin/stable-4.0 配置&编译 在工程的根目录下执行 ./conf…

关于Spring和缓存雪崩、穿透、击穿、预热的最常见的十道面试题

面试题一:什么是缓存雪崩?如何解决缓存雪崩? 缓存雪崩指的是在短时间内,有大量的请求直接查询术后句酷,从而对数据库造成大量的压力,严重情况下可能导致数据库宕机的情况叫做缓存雪崩 我们可以看一下正常…