全面解析 Spring AOP 切入点表达式

news2025/4/3 1:09:20

全面解析 Spring AOP 切入点表达式

大家好,我是钢板兽!

Spring AOP(面向切面编程)是我们日常开发中实现日志记录、权限控制、事务管理等功能的神器。而切入点表达式(Pointcut Expression)则是这个神器的“瞄准镜”——你想拦哪里,就靠它来精确定位!

本篇文章将带你全面了解 AOP 切入点表达式的写法、含义、常见用法、以及典型场景实战。

文章目录

  • 全面解析 Spring AOP 切入点表达式
    • 1.什么是切入点表达式?
    • 2.切入点表达式详解
      • 2.1`execution`:按方法签名匹配
      • 2.2`within`:匹配某个类或包下的所有方法
      • 2.3`@annotation`:匹配打了特定注解的方法
      • 2.4 `args(...)`:匹配方法参数类型
      • 2.5`@within` / `@target`:匹配类上的注解
      • 2.6`bean(beanName)`:按 Bean 名称匹配
    • 3.实战推荐组合用法
      • 3.1全局统一增强(比如日志)
      • 3.2 精准注解增强
    • 4.表达式参考速查表

1.什么是切入点表达式?

切入点表达式是 Spring AOP 中用于描述增强逻辑应该作用在哪些方法上的一种匹配语法。

搭配 @Aspect@Before@After@Around 等注解使用:

@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
    System.out.println("执行方法:" + joinPoint.getSignature().getName());
}

这条表达式的意思是:“匹配 com.example.service 包下所有类的所有方法”。

最常见的表达式是以 execution(...) 开头的,如:

execution(方法修饰符 返回值类型 包名.类名.方法名(参数))

参数可以使用通配符,表示“任意”或“全部”

2.切入点表达式详解

2.1execution:按方法签名匹配

写法含义
execution(* com.example.service.UserService.*(..))匹配 UserService 中所有方法
execution(public void com.example.service.UserService.createUser(..))精确匹配某个方法
execution(* com.example..*Service.*(..))匹配 com.example 包及其子包下所有以 Service 结尾的类的方法
execution(* *(..))匹配所有方法(慎用!)
  • * 表示任意
  • .. 表示任意层级包或任意参数

2.2within:匹配某个类或包下的所有方法

@Within("com.example.service.UserService")

匹配该类的所有方法。

@Within("com.example.service..*")

匹配 service 包及其子包下所有类的方法。


2.3@annotation:匹配打了特定注解的方法

@Before("@annotation(com.example.anno.Log)")

只拦截那些加了 @Log 注解的方法。

2.4 args(...):匹配方法参数类型

@Before("args(java.lang.String)")

匹配第一个参数为 String 类型的方法。

@Before("args(.., int)")

匹配最后一个参数是 int 的方法。

2.5@within / @target:匹配类上的注解

  • @within(MyAnnotation):拦截被注解的类中的所有方法
  • @target(MyAnnotation):和 @within 类似,但作用在代理类上

2.6bean(beanName):按 Bean 名称匹配

@Before("bean(userService)")

只拦截 Bean 名为 userService 的方法,适合用于特定 Spring Bean 的增强。

3.实战推荐组合用法

3.1全局统一增强(比如日志)

@Aspect
@Component
public class LogAspect {
    @Before("execution(* com.example.service..*.*(..))")
    public void log(JoinPoint jp) {
        System.out.println("[LOG] " + jp.getSignature());
    }
}

3.2 精准注解增强

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Audit {
    String value() default "";
}

// 切面类
@Aspect
@Component
public class AuditAspect {
    @Before("@annotation(audit)")
    public void audit(Audit audit) {
        System.out.println("审计操作模块:" + audit.value());
    }
}

// 业务方法
@Audit("用户模块")
public void updateUser(String name) { ... }

4.表达式参考速查表

表达式描述
execution(* com.example..*.*(..))所有方法
@annotation(Log)有 @Log 注解的方法
within(com.example..*)指定包内的所有类的方法
args(String, ..)第一个参数是 String 的方法
bean(userService)Bean 名为 userService 的对象的方法

如果这篇文章对你有帮助,欢迎点赞、转发、留言。

         | 第一个参数是 String 的方法         |

| bean(userService) | Bean 名为 userService 的对象的方法 |


如果这篇文章对你有帮助,欢迎点赞、转发、留言。

关注我带你学习更多Java后端开发的技术干货 !

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

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

相关文章

GO语言杂记(文章持续更新)

1、MAIN冲突 在一个文件夹下有两个go文件同时写了main函数,将会报错,main函数只能在main包中。 实则不然,有些环境下并不会报错。 2、gofmt命令---自动对齐 命令作用:将go文件代码自动缩进。 gofmt -w escapecharprac.go

OS6.【Linux】基本指令入门(5)

目录 1.配置公网IP到XShell中 2.日志 定义和作用 3.一些指令 date %Y、%m、%d、%H、%M、%S、%X、%F %s 时间戳的特点 时间戳的转换 cal cal 年份 其他选项 ★find★ whereis grep 练习 -v选项 -n选项 -i选项 多文件查找 特定目录下查找 1.配置公网IP到XShe…

Moo0 VideoResizer,简单高效压缩视频!

Moo0 VideoResizer 是一款免费、轻量级的视频压缩工具,支持通过调整文件大小、屏幕尺寸或比特率等方式实现高效视频压缩。其核心优势在于操作简单且无需破解,可直接下载安装使用‌。软件注重用户友好性,采用非破坏性压缩技术,所有…

【开发问题记录】高德地图 Web 端开发详解:高德地图 API 最佳实践指南(安装、marker添加、逆向地理编码、实际业务案例实操)

文章目录 1、引入高德地图的准备工作2、高德地图 JS API 使用方式2.1 JS API Loader2.1.1 使用 script 标签加载loader2.1.2 NPM 安装loader 2.2 script 标签加载 JS API 脚本2.2.1 同步加载2.2.2 异步加载 3、在 vue3 项目中使用3.1 安装 js api loader3.2 在组件中使用 4、实…

快速入手-基于Django-rest-framework的自身组件权限认证(九)

1、在对应的视图函数里增加认证(局部起作用,不全局生效) 导入类: from rest_framework.authentication import ( BasicAuthentication, SessionAuthentication, ) from rest_framework.permissions import IsAuthentica…

【复活吧,我的爱机!】Ideapad300-15isk拆机升级:加内存条 + 换固态硬盘 + 换电源

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言升级成本升级流程电池健康度加内存条和换内存条光驱位加装机械硬盘更换电池重装系…

基于Spring AI开发本地Jenkins MCP Server服务

前言 首先介绍下MCP是什么? MCP是由开发了 Claude 模型的 Anthropic 公司2024年11月提出并开源的一项开放标准,全称:Model Context Protocol,它是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…

【nvidia】Windows 双 A6000 显卡双显示器驱动更新问题修复

问题描述:windows自动更新nvidia驱动会导致只检测得到一个A6000显卡。 解决方法 下载 A6000 驱动 572.83-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.exehttps://download.csdn.net/download/qq_18846849/90554276 不要直接安装。如…

《SRv6 网络编程:开启IP网络新时代》第2章、第3章:SRv6基本原理和基础协议

背景 根据工作要求、本人掌握的知识情况,仅针对《SRv6 网络编程:开启IP网络新时代》书籍中涉及的部分知识点进行总结梳理,并与工作小组进行分享,不涉及对原作的逐字搬运。 问题 组内同事提出的问题:本文缺扩展头描述…

如何将AI模型返回的字符串转为html元素?

场景&#xff1a; 接入deepseek模型的api到我们平台&#xff0c;返回的字符串需要做下格式化处理。 返回的数据是这样的&#xff1a; {"role": "assistant","content": "<think>\n嗯&#xff0c;用户问的是“星体是什么”。首先&am…

【PCIE711-214】基于PCIe总线架构的4路HD-SDI/3G-SDI视频图像模拟源

产品概述 PCIE711-214是一款基于PCIE总线架构的4路SDI视频模拟源。该板卡为标准的PCIE插卡&#xff0c;全高尺寸&#xff0c;适合与PCIE总线的工控机或者服务器&#xff0c;板载协议处理器&#xff0c;可以通过PCIE总线将上位机的YUV 422格式视频数据下发通过SDI接口播放出去&…

突破反爬困境:SDK开发,浏览器模块(七)

声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的&#xff0c;旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…

rce操作

Linux命令长度突破限制 源码 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } echo执行函数&#xff0c;$_REQUEST可以接post、get、cookie传参 源码中对参数长度做了限制&#xff0c;小于8位&#xff0c;可以利用临时函数&…

LabVIEW高效溢流阀测试系统

开发了一种基于LabVIEW软件和PLC硬件的溢流阀测试系统。通过集成神经网络优化的自适应PID控制器&#xff0c;该系统能自动进行压力稳定性、寿命以及动静态性能测试。该设计不仅提升了测试效率&#xff0c;还通过智能化控制提高了数据的精确性和操作的便捷性。 ​ 项目背景&…

DataGear 5.3.0 制作支持导出表格数据的数据可视化看板

DataGear 内置表格图表底层采用的是DataTable表格组件&#xff0c;默认并未引入导出数据的JS支持库&#xff0c;如果有导出表格数据需求&#xff0c;则可以在看板中引入导出相关JS支持库&#xff0c;制作具有导出CSV、Excel、PDF功能的表格数据看板。 在新发布的5.3.0版本中&a…

Web网页内嵌 Adobe Pdf Reader 谷歌Chrome在线预览编辑PDF文档

随着数字化办公的普及&#xff0c;PDF文档已成为信息处理的核心载体&#xff0c;虽然桌面端有很多软件可以实现预览编辑PDF文档&#xff0c;而在线在线预览编辑PDF也日益成为一个难题。 作为网页内嵌本地程序的佼佼者——猿大师中间件&#xff0c;之前发布的猿大师办公助手&am…

Sentinel[超详细讲解]-1

定义一系列 规则 &#x1f47a;&#xff0c;对资源进行 保护 &#x1f47a;&#xff0c; 如果违反的了规则&#xff0c;则抛出异常&#xff0c;看是否有fallback兜底处理&#xff0c;如果没有则直接返回异常信息&#x1f60e; 1. 快速入门 1.1 引入 Sentinel 依赖 <depend…

如何让 SQL2API 进化为 Text2API:自然语言生成 API 的深度解析?

在过去的十年里&#xff0c;技术的进步日新月异&#xff0c;尤其是在自动化、人工智能与自然语言处理&#xff08;NLP&#xff09;方面。 随着“低代码”平台的崛起&#xff0c;开发者和非技术人员能够更轻松地构建强大而复杂的应用程序。然而&#xff0c;尽管技术门槛降低了&…

OCCT(2)Windows平台编译OCCT

文章目录 一、Windows平台编译OCCT1、准备环境2、下载源码3、下载第三方库4、使用 CMake 配置5、编译OCCT源码6、运行示例 一、Windows平台编译OCCT 1、准备环境 安装工具&#xff1a; Visual Studio&#xff08;推荐 VS2019/2022&#xff0c;选择 C 桌面开发 组件&#xff0…

【蓝桥杯—单片机】通信总线专项 | 真题整理、解析与拓展 (更新ing...)

通信总线专项 前言SPI第十五届省赛题 UART/RS485/RS232UARTRS485RS232第十三届省赛题小结和拓展&#xff1a;传输方式的分类第十三届省赛 其他相关考点网络传输速率第十五届省赛题第十二届省赛题 前言 在本文中我会把 蓝桥杯单片机赛道 历年真题 中涉及到通信总线的题目整理出…