Pointcut 表达式是 AOP 的核心,我将详细解析最常用的 execution 表达式,并介绍其他几种同样非常有用的表达式。

1. execution 指示符 (最常用,最强大)

execution 用于匹配方法的执行(Join Point)。它的语法结构最为完整,也最为灵活。

语法结构
execution( [修饰符模式]? 返回类型模式 [声明类型模式]? 方法名模式(参数模式) [抛出异常模式]? )
  • 方括号 [] 内的部分是可选的。
  • ? 表示该部分是可选的。
语法分解与示例

让我们通过一个具体的例子来逐一分解:
execution(public * com.example.service..*.set*(..))

部分示例含义
[修饰符模式]public匹配 public 修饰的方法。可以省略,表示匹配任何修饰符。也可以用 *
返回类型模式*匹配任意返回类型。也可以是具体的类型如 Stringvoid
[声明类型模式]com.example.service..*.匹配方法所在的类型。这部分非常灵活:
- com.example.service.UserService:精确匹配 UserService 类。
- com.example.service.*:匹配 service 包下的任意直接类
- com.example.service..*:匹配 service及其所有子包下的任意类。最后的 . 是必需的。
方法名模式set*匹配以 set 开头的方法名。也可以是精确的方法名 setName 或通配符 *
(参数模式)(..)匹配任意数量、任意类型的参数。这是最常用的模式。
- ():匹配无参方法。
- (*):匹配只有一个任意类型参数的方法。
- (String, ..):匹配第一个参数是 String,后面有任意数量、任意类型的参数。
[抛出异常模式](省略)匹配方法声明抛出的异常类型。例如 throws java.io.IOException。这部分很少使用。

这个例子的完整含义是:
拦截 com.example.service 包及其所有子包中,所有类的,所有以 set 开头的,public 修饰的,不限返回值和参数的方法。


2. 其他常用 Pointcut 指示符

除了 execution,还有一些在特定场景下非常好用的指示符。

within 指示符

within 用于限定连接点必须在指定的类型或包的范围内。它比 execution 更粗粒度,只关心位置,不关心方法签名。

  • 语法: within(类型或包模式)

  • 示例:

    • within(com.example.service.UserService): 匹配 UserService 类中的所有方法
    • within(com.example.service.*): 匹配 service 包下所有类中的所有方法。
    • within(com.example.service..*): 匹配 service 包及其所有子包下所有类中的所有方法。
  • execution 的区别:

    • execution(* com.example.service.UserService.*(..))within(com.example.service.UserService) 看起来相似,但 within 的粒度更大。例如,within 不关心方法的修饰符、返回类型等。
@annotation 指示符

@annotation 用于匹配持有指定注解的方法。这对于创建自定义注解来实现 AOP 非常有用,是实现声明式功能(如声明式日志、声明式缓存)的最佳方式。

  • 语法: @annotation(注解类型的完全限定名)

  • 示例:

    1. 定义一个自定义注解:
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface MyLoggable {}
      
    2. 在方法上使用注解:
      @Service
      public class MyService {@MyLoggablepublic void doSomething() { /* ... */ }
      }
      
    3. 编写切点:
      @Pointcut("@annotation(com.example.aop.MyLoggable)")
      public void loggableMethods() {}
      
      这个切点会精确地匹配所有被 @MyLoggable 注解的方法。
@within@target
  • @within: 匹配持有指定注解的类中的所有方法。

    • 示例: @within(org.springframework.stereotype.Service) 会匹配所有被 @Service 注解的类中的所有方法。
  • @target: 匹配目标对象的类持有指定注解的所有方法。@within@target 在大多数情况下效果相同。

args@args

这两个指示符用于根据方法的参数来匹配。

  • args(): 匹配方法的参数类型

    • args(java.lang.String, ..): 匹配第一个参数是 String 类型的方法。
    • args(): 匹配无参方法。
    • args(user): 这种形式不仅匹配参数类型,还能在通知中绑定参数值
      @Before("execution(* com.example..*.*(com.example.User)) && args(user)")
      public void processUser(User user) {//可以直接使用 user 对象System.out.println("Processing user: " + user.getName());
      }
      
  • @args(): 匹配方法的参数在运行时所持有的注解

    • @args(com.example.validation.Validatable, ..): 匹配第一个参数对象被 @Validatable 注解标注的方法。

3. 组合切点 (Combining Pointcuts)

你可以使用逻辑运算符 && (与), || (或), ! (非) 来组合多个切点,创建更复杂的规则。

@Aspect
@Component
public class SecurityAspect {// 匹配 service 包下的所有方法@Pointcut("within(com.example.service..*)")public void inServiceLayer() {}// 匹配被 @AdminOnly 注解的方法@Pointcut("@annotation(com.example.security.AdminOnly)")public void adminOnlyMethods() {}// 组合切点:在 service 层中,并且是 admin-only 的方法@Before("inServiceLayer() && adminOnlyMethods()")public void checkAdminAccess() {// ... 执行权限检查逻辑System.out.println("Admin access granted!");}// 组合切点:不在 service 层中的所有方法@Before("!inServiceLayer()")public void nonServiceMethodLog() {// ...}
}

总结

指示符作用优点
execution最核心、最常用,匹配方法的完整签名。最精确,控制粒度最细。
within匹配指定包或类中的所有方法。语法简单,适合按模块划分。
@annotation匹配持有指定注解的方法解耦性最好,通过注解驱动AOP,业务代码无侵入。
@within, @target匹配持有指定注解的类中的所有方法。适合对整个类别的Bean进行增强。
args, @args根据方法的参数类型或参数注解来匹配。适合处理特定类型的数据流。
**&&, `, !`**

在实际开发中,execution@annotation 是使用频率最高的两种方式。建议优先使用 @annotation 来实现自定义的声明式功能,因为它能让我们的代码意图更加清晰。

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

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

相关文章

基于 SpringBoot+Vue 的台球厅管理系统的设计与实现(毕业论文)

基于 SpringBootVue 的台球厅管理系统的设计与实现(模板)[三号宋体加粗,居中] 摘 要[首行缩进2字符,五号黑体加粗]:摘要内容[五号楷体]本文所提出的基于J2EE/EJB标准的电子化采购平台及其CRM组件综合解决方案&#xf…

运营医疗信息化建设的思路

医疗机构加强运营管理,必须依赖强有力的医院信息系统。信息化很重要,但不能为了信息化而信息化。运营信息化必须有明确的建设目标。 运营信息化建设的目标,包括几个方面: 1.实时反映业务; 2.体现内控思维&#xff1b…

6.24_JAVA_微服务day07_RabbitMQ高级

1、 RabbitListener(queuesToDeclare/*此处是固定写法,只能写这个玩意儿,因为这里是库里的方法*/ Queue(name "lazy.queue",//如果不存在就创建lazy.queue队列durable "true",//把耐用打开arguments Argument(name "x-que…

Python打卡:Day38

知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 浙大疏锦行

质量管理五大核心工具之SPC

SPC(Statistical Process Control,统计过程控制)是一种基于统计学的质量控制方法,旨在通过监控和分析生产过程数据,识别异常波动并消除异常因素,从而确保过程稳定受控,提升产品质量一致性145。以…

【世纪龙科技】新能源汽车VR虚拟体验展示馆-解锁认知新维度

解锁新能源汽车深度认知新维度:沉浸式 VR 虚拟体验展示馆 在科技不断突破边界的当下,人们对新能源汽车的探索渴望愈发强烈。无论是希望深入了解行业发展脉络的求知者,还是想要直观掌握汽车技术原理的学习者,传统的展示方式似乎总…

oracle基础审计管理

Oracle数据库审计功能详解(简单易懂!) 更新时间:2024年01月30日 16:21:27 作者:前程的前程也迷茫 Oracle审计查询是一项重要的任务,可以帮助DBA更好的管理Oracle数据库,下面这篇文章主要给大家介绍了关于Oracle数据库审计功能的相关资料,文中通过代码介绍…

Day44 预训练模型

目录 一、预训练的概念 二、常见的分类预训练模型 2.1 CNN架构预训练模型 2.2 Transformer类预训练模型 2.3 自监督预训练模型 三、图像预训练模型的发展史 四、预训练的策略 五、预训练代码实战:resnet18 六、尝试在cifar10对比alexnet 七、尝试通过ctrl进…

寻找两个正序数组的中位数:二分查找的终极算法

引言:中位数的「C位之争」 如果把数组比作排队买奶茶的队伍,中位数就是那个站在正中间的幸运儿——不需要知道所有人的位置,只需要找到那个「刚刚好」的中间位置。这个问题看似简单,却藏着算法世界的「效率密码」,尤其…

使用tensorflow的线性回归的例子(一)

拟合y2x1 import matplotlib.pyplot as plt import numpy as np import tensorflow as tf print(tf.__version__) %matplotlib inline #载入随机种子 np.random.seed(5) #生成100个等差序列,每个值在-1 - 1 之间 x_data np.linspace(-1,1,100) #y 2x …

OpenLayers 渲染之矢量影像图层

前言 :::block-1 对于像GeoJSON、KML等地理数据格式的文件,最常用的方法都是通过VectorLayer进行渲染。除此之外,还可以使用VectorImage(矢量影像图层)进行渲染。本文主要介绍在客户端拖动上传GeoJSON、KML等文件,并采…

Feign 实战指南:从 REST 替代到性能优化与最佳实践

Feign 实战指南:从 REST 替代到性能优化与最佳实践 一 . Feign 替代 RestTemplate1.1 RestTemplate 方式调用存在的问题1.2 Feign 的介绍1.3 定义和使用 Feign 客户端1.3.1 引入依赖1.3.2 添加注解1.3.3 编写 Feign 的客户端进行接口声明1.3.4 测试小结 1.4 通过 PO…

什么是国际期货?期货交易平台搭建

国际期货(International Futures),又称外盘期货或全球期货,是指在中国大陆以外的交易所进行标准化合约交易的金融衍生品市场。其核心特征、功能及与国内期货的区别如下: 📍 一、定义与核心特征 全球化交易…

考取华为HCIE-AI有什么用?

在人工智能技术重塑各行各业的浪潮中,掌握核心AI能力成为专业人士的制胜关键。华为推出的HCIE-AI Solution Architect(华为认证ICT专家-AI解决方案架构师),正是面向这一领域顶尖人才设立的最高级别认证。主要是为了培养和认证掌握…

Maven 使用说明和配置

作者:小凯 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言 Apache Maven (opens new window)是一个软件项目管理、构建和依赖工具。基于项目对象模型 (POM) 的概念,Maven 可以通过中央信息来管理项目的构建、…

【Docker管理工具】安装Docker容器自动更新工具Watchtower

【Docker管理工具】安装Docker容器自动更新工具Watchtower 一、Watchtower介绍1.1 Watchtower简介1.2 Watchtower使用注意1.3 Watchtower使用场景1.4 Docker容器介绍 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版…

AI优化SEO关键词精进

内容概要 随着人工智能技术的飞速发展,其在搜索引擎优化(SEO)领域的应用正引发深刻变革。本文将系统探讨AI如何革新传统的关键词优化策略,通过更智能的分析与匹配方法,显著提升内容在搜索结果中的可见度与排名。核心议…

canvas面试题200道

下面是一份 200 条关于 HTML5 Canvas 的面试题合集,适用于前端开发岗位的中高级工程师面试准备。内容涵盖基础概念、绘图操作、性能优化、动画实现、安全机制等多个方面,并附有参考答案或解析建议。 🧠 一、Canvas 基础知识(1-40) 1. 什么是 HTML5 Canvas? <canvas&…

Java 大视界 -- Java 大数据在智能安防视频监控系统中的目标轨迹预测与防范策略制定(325)

Java 大视界 -- Java 大数据在智能安防视频监控系统中的目标轨迹预测与防范策略制定&#xff08;325&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 驱动的安防视频数据采集与预处理架构1.1 多路异构视频流合规接入层&#xff08;GB/T 28181-2021 全协议适配&#xff…

【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示

我用夸克网盘分享了「lgbtq_rights_by_country数据集」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/aa0fa91491e8 摘要&#xff1a; 本文运用Python编程实现对LGBTQ权利相关数据的处理与可视化展示。通过直方图与地图两种可视化方式&#xff0c;分…