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

面试常问的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.lryc.cn/news/287532.html

相关文章:

  • C++拾遗(四)引用与指针
  • k8s架构、工作流程、集群组件详解
  • CF1362C Johnny and Another Rating Drop(二进制、复杂度考虑)
  • 1 - 搭建Redis数据库服务器|LNP+Redis
  • 米贸搜|Facebook“精准营销”越来越难?或许是“受众定位”没彻底搞清!
  • 【C++】内存分区模型
  • 通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错
  • 基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151
  • 【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • VI / VIM的使用
  • 第十二站(20天):C++泛型编程
  • 【Docker】Dokcer学习① - 简介
  • PostgreSQL 100条命令
  • HTTP动态代理的原理及其对网络性能的影响
  • 69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey
  • JavaScript实现的一些小案例
  • MVC模式
  • Java中的代理模式(一)
  • 跳跃游戏-算法
  • ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评
  • 外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护
  • kotlin map 与 flatmap
  • nginx-rtmp-module 支持 Enhancing RTMP HEVC(H.265)
  • 2024最新JDK1.8+JDK17+JDK21安装包下载+文档
  • 如何利用chatgpt提升工作效率
  • WinSCP下载安装并实现远程SSH本地服务器上传文件
  • QEMU搭建arm虚拟机开发环境
  • web 应用常见的安全问题
  • 502. IPO
  • 如何安装MeterSphere并实现无公网ip远程访问服务管理界面