Spring高手之路-Spring的AOP失效场景详解

目录

前言

1.非Spring管理的对象

2.同一个Bean内部方法调用

3.静态方法

4.final方法

5.异步方法

总结


前言

Spring的AOP(面向切面编程)是一种强大的技术,用于在应用程序中实现横切关注点的模块化。虽然Spring的AOP在大多数情况下都是有效的,但在某些场景下可能会失效。下面来分析Spring AOP失效的常见场景

关于什么是Spring Aop

Spring高手之路-Spring AOP-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135197938?spm=1001.2014.3001.5502

首先,Spring的AOP其实是通过动态代理实现的,所以,想要让AOP生效,前提必须是动态代理生效,并且可以调用到代理对象的方法

1.非Spring管理的对象

Spring的AOP只能拦截由Spring容器管理的Bean对象。如果您使用了非受Spring管理的对象,则AOP将无法对其进行拦截。

2.同一个Bean内部方法调用

如果一个Bean内部的方法直接调用同一个Bean内部的另一个方法,AOP将无法拦截这个内部方法调用。因为AOP是基于代理的,只有通过代理对象才能触发AOP拦截。

@Component
public class MyBean {
  
  public void method1() {
    System.out.println("Inside method1");
    method2(); // 直接调用同一个 Bean 内部的另一个方法
  }
  
  public void method2() {
    System.out.println("Inside method2");
  }
}

假设我们有一个名为 MyBean 的类,其中包含了两个方法 method1()method2()。在 method1() 中,直接调用了 method2() 方法。

现在,让我们创建一个切面来拦截 method1() 的执行,并打印一些日志信息:

@Aspect
@Component
public class MyAspect {
  
  @Before("execution(* com.example.MyBean.method1())")
  public void beforeMethod1() {
    System.out.println("Before method1 execution");
  }
}

上述切面使用 @Before 注解来定义了一个前置通知,在执行 MyBean 类的 method1() 方法之前被触发。

然后,我们在 Spring 应用程序中使用这两个组件:

@SpringBootApplication
public class MyApplication {
  
  public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
    
    MyBean myBean = ApplicationContext.getBean(MyBean.class);
    myBean.method1();
  }
}

当我们运行应用程序时,我们会发现 "Before method1 execution" 这条日志信息被打印出来,但是 "Inside method2" 这条日志信息却没有被打印出来。这是因为 AOP 无法拦截 method2() 的直接调用,而只能拦截通过代理对象触发的方法调用。

3.静态方法

Spring的AOP只能拦截非静态方法。如果您尝试拦截静态方法,AOP将无法生效。

4.final方法

AOP无法拦截final方法。final方法是不可重写的,因此AOP无法生成代理对象来拦截这些方法。

直接在对象内部调用方法:如果您直接在对象内部调用方法而不通过代理对象,AOP将无法拦截。因此,建议始终通过代理对象调用方法以确保AOP的生效。

5.异步方法

对于使用Spring的异步特性(如@Async注解)的方法,AOP拦截器可能无法正常工作。这是因为异步方法在运行时会创建新的线程或使用线程池,AOP拦截器无法跟踪到这些新线程中的方法调用。

总结

以下几种情况会导致AOP失效:

非Spring管理的对象

私有方法调用

静态方法调用

final方法调用

类内部自调用

内部类方法调用

异步方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot - Application Events 的发布顺序_ApplicationFailedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

MySQL进阶45讲【1】基础架构:一条SQL查询语句是如何执行的?

1 前言 我们经常说,看一个事儿千万不要直接陷入细节里,应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,有个最简单的…

浅谈敏捷开发的思维

什么是敏捷 Agile(敏捷)来源于敏捷宣言,宣言明确指出,“敏捷”: 不是一种方法论也不是开发软件的具体方法更不是一个框架或者过程 “敏捷”是一套价值观(理念)和原则,帮助团队在软…

PVE虚拟机配置文件恢复(qm list不显示虚拟机,web控制台看不到虚拟机)

本文章的目的是故障后复盘: 故障现象在命令行执行qm list不显示虚拟机,web控制台看不到虚拟机,网上查不到相关现象的处理办法。 处理思路:虚拟机还在正常工作,通过查看kvm进程ps aux | grep kvm,百度查看…

产品百度百科怎么创建?产品如何上百度百科?

百度百科作为一个权威的信息平台,承载着巨大的流量和曝光度。对于一个产品来说,能够在百度百科上拥有一席之地,无疑是一种极高的荣誉,同时也是提升品牌知名度、增加信任度的重要手段。产品百度百科不仅能够详细、全面地介绍产品信…

【学习iOS高质量开发】——熟悉Objective-C

文章目录 一、Objective-C的起源1.OC和其它面向对象语言2.OC和C语言3.要点 二、在类的头文件中尽量少引用其他头文件1.OC的文件2.向前声明的好处3.如何正确引入头文件4.要点 三、多用字面量语法,少用与之等价的方法1.何为字面量语法2.字面数值3.字面量数组4.字面量字…

跟着cherno手搓游戏引擎【6】ImGui和ImGui事件

导入ImGui: 下载链接: GitHub - TheCherno/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C with minimal dependencies 新建文件夹,把下载好的文件放入对应路径: SRC下的premake5.lua文件&#…

算法通关村番外篇-LeetCode编程从0到1系列四

大家好我是苏麟 , 今天带来算法通关村番外篇-LeetCode编程从0到1系列四 . 矩阵 1672. 最富有客户的资产总量 描述 : 给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产…

书客Sun立式护眼台灯正式上市,技术优势全面领跑,革新行业的护眼养眼!

在当今智能化的社会,我们与电子屏幕的接触日益增多,同时,无需离开家门即可享受各种便捷服务。由于过度使用电子设备、与阳光的接触机会逐渐减少或其他不合理的用眼习惯导致近视问题不断加剧。 作为专业的护眼品牌,SUKER书客深刻认…

Python画球面投影图

天文学研究中,有时候需要画的并不是传统的XYZ坐标系,而是需要画一个形如这样子的球面投影图: 下面讲一下这种图怎么画 1. 首先要安装healpy包 pip install healpy 2. 然后导入包 如果之前安装过healpy,有的会提示不存在healpy…

matlab串口数据交互的使用

一、matlab将串口数据读取并储存到position中 delete(instrfindall);%注销系统之前已经打开的串口资源 clear s %清空s的数据 s serial(COM6,BaudRate,115200);%定义串口及波特率 fopen(s)%打开串口 fwrite(s,00AB,)%向串口写入读取电机位置指令 for i1:8 %共8个电机position…

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

【UE Niagara 喷射火焰系列】06 - 制作火焰喷射过程中飞舞的火星

在上一篇博客(【UE Niagara学习笔记】05 - 喷射火焰顶部的蓝色火焰)的基础上继续实现喷射火焰的火星的效果。 目录 效果 步骤 一、创建材质实例 二、添加新的发射器 2.1 设置粒子材质 2.2 设置发射器持续生成粒子 2.3 设置粒子生成数量 2.4 设…

day19【LeetCode力扣】160.相交链表

day19【LeetCode力扣】160.相交链表 1.题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链…

是时候丢掉 DDE 了

有人问我这样一个问题: “作为一名应用程序开发者,如果希望和外壳(Explorer/Shell)打交道,我可以直接忽略掉 DDE 吗?” 此问题的答案是:是的,完全没有任何问题。虽然在发明它的 16 位 Windows 协作多任务…

HubSpot电子邮件自动回复怎么设置?附注意事项!

HubSpot 提供了电子邮件自动回复的功能,使得企业能够更高效地管理和处理电子邮件通信。以下是关于 HubSpot 电子邮件自动回复的一些重要信息和步骤: 设置电子邮件自动回复的步骤: 登录HubSpot账户: 打开 HubSpot 平台并登录你的账…

数据管理系统-week2-对象数据模型

文章目录 前言一、对象的类二、关联(Association)三、 连接属性(Link Attribute)四、关联类(Association Class)五、Qualification五、Generalisation参考文献Association • Link Attribute • Association Class • Qualification • Generalization 前言 在实际的项…

Python--GIL(全局解释器锁)

在Python中,GIL(全局解释器锁)是一个非常重要的概念,它对Python的多线程编程有着深远的影响。GIL是Python解释器级别的锁,用于保证任何时刻只有一个线程在执行Python字节码。这意味着即使在多核处理器上,Py…

Java Web 状态管理(上) Cookie基础

Java Web 状态管理(上) Cookie基础知识 前言一、Cookie产生的背景(不重要)二、Cookie简介三、Cookie的使用场景引入添加苹果进入购物车添加香蕉进入购物车那么假设说没有Cookie正常有Cookie的情况 四、场景简单模拟创建第一个Serv…

蓝桥杯备赛day02 -- 算法训练题 拿金币Java

目录 题目: 问题描述 输入格式 输出格式 解题过程 第一步 定义dp数组 第二步 确定 dp 数组递推公式 第三步 dp数组的初始化 第四步 dp数组的遍历顺序 第五步 举例说明 报错:内存超限 用dp数组去存储位置上的金币 dp数组从二维降为一维 收获&a…