spring---@Pointcut表达式

spring语法

execution

方法表达式:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern/name-pattern(param-pattern) throws-pattern?)

  • 修饰符匹配(modifier-pattern?):可以省略。代表匹配任意修饰符方法;或者显示指定public、private
  • 返回值匹配(ret-type-pattern):不可省略。可以为*,表示任何返回值;或者全路径的类名
  • 类路径匹配(declaring-type-pattern)/方法名匹配(name-pattern):两种任选一个,不可省略。全路径类名或者正则方法名;或者*,代表所有。
  • 参数匹配((param-pattern)):不可省略。() 匹配一个不需要参数的方法;(…) 匹配任何数量(零或更多)的参数;(*) 模式匹配一个需要任何类型的参数的方法;(*,java.lang.String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;
  • 异常类型匹配(throws-pattern?):可以省略,代表匹配任意异常,或者全路径显示指定。
  • 示例:
    execution(* com.hytech.user.service.UserOuterService.*(..))UserOuterService接口所定义的任何方法的 execution
    execution(* com.hytech.user.service.*.*(..)):在 service 包中定义的任何方法的 execution:
    execution(* com.hytech.user.service..*.*(..)):在 service 包或其子包中定义的任何方法的 execution。
    

within

类型表达式:within(declaring-type-pattern)

  • 类路径匹配(declaring-type-pattern):不可省略,全限定命名,支持正则
  • 示例:
    within(com.hytech.user.service.impl.UserOuterServiceImpl):过滤UserOuterServiceImpl的方法
    within(com.hytech.user.service.impl.*):过滤impl包内的所有类的方法
    within(com.hytech.user.service..*):过滤impl包及其子包内的所有类的方法
    

this

代理对象表达式:this(type)

  • 数据类型匹配:当生成的代理对象可以转换为指定的类型时匹配。但需注意基于JDK接口的代理和基于CGLIB的代理生成的代理对象是不一样的。尽量用target,若必须用则指定接口类。

  • 示例:

    this(com.hytech.user.service.UserOuterService):当生成的代理对象可以转换为UserOuterService类型时匹配
    

target

目标对象表达式:target(type)

  • 数据类型匹配:当被代理的目标对象可以被转换为指定的类型时则表示匹配。使用实现类匹配。
  • 示例:
    target(com.hytech.user.service.impl.UserOuterServiceImpl):当被代理的目标对象可以被转换为UserOuterServiceImpl类型时匹配
    

args

参数表达式:args()

  • 匹配方法参数:当参数格式符合时进行匹配
  • 示例:
    args():匹配任何不带参数的方法。
    args():带任意参数的方法。
    args(java.lang.String):匹配任何只带一个参数,而且这个参数的类型是String的方法。
    args(java.lang.String,):匹配带任意个参数,但是第一个参数的类型是String的方法。
    args(,java.lang.String):匹配带任意个参数,但是最后一个参数的类型是String的方法。	
    

@args

注解参数表达式:@args(annotation)

  • 匹配参数上有指定注解:匹配任意需要传参的方法,并且所传递的参数的运行时类型具有指定注解
  • 示例:
    @args(com.xyz.security.Classified):匹配任意方法参数类型上拥有Classified注解的方法调用。
    

@target

注解目标对象表达式:@target(annotation)

  • 匹配目标对象上有指定注解:匹配当被代理的目标对象对应的类型及其父类型上拥有指定的注解时
  • 示例:
    @target(org.springframework.transaction.annotation.Transactional):匹配任意目标对象有@Transactional注解,即实例类型
    

@within

注解搭理对象表达式:@within(annotation)

  • 匹配代理对象对应的类型或其父类型拥有指定的注解的情况
  • 示例:
    @within(org.springframework.transaction.annotation.Transactional):匹配任意代理对象有@Transactional注解,即声明类型
    

@annotation

注解表达式:@annotation()

  • 匹配任意方法上拥有指定注解的情况
  • 示例:
    @annotation(org.springframework.transaction.annotation.Transactional):执行的方法有@Transactional注解即会匹配。
    

注意

  1. 模糊匹配语法,但结合具体pointCut有不同释义,主要就是匹配对象还是方法

    • .*:任意方法/对象
    • ..*:包下及子包下的任意对象
    • .*.*:包下的任意类的任意方法
    • ..*.*:包下及子包下的任意类的任意方法
  2. 可以结合使用,使用 && || !

  3. 类型匹配语法

    • * :匹配任何数量字符;
    • … :匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。
    • + :匹配指定类型的子类型;仅能作为后缀放在类型模式后边。
    • 示例:
      java.lang.String    匹配String类型; 
      java.\*.String       匹配java包下的任何“一级子包”下的String类型; 如匹配java.lang.String,但不匹配java.lang.ss.String 
      java..\*            匹配java包及任何子包下的任何类型。如匹配java.lang.Stringjava.lang.annotation.Annotation 
      java.lang.*ing      匹配任何java.lang包下的以ing结尾的类型;
      java.lang.Number+  匹配java.lang包下的任何Number的子类型; 如匹配java.lang.Integer,也匹配java.math.BigInteger 
      
  4. aop表达式不是spring独有的,Spring将Spring AOP和IoC与AspectJ无缝集成,所以spring隐式的支持很多AspectJ的语法。例如

    within(@annotation *)不是spring官网的语法,但spring依旧可以识别,它等效为 @within(annotation);而后者才是spring的官方建议写法。
    

    但是最好还是按照spring官方的建议,以免出现异常

AspectJ语法

Spring AOP支持的AspectJ切入点指示符

  • execution:用于匹配方法执行的连接点;
  • within:用于匹配指定类型内的方法执行;
  • this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
  • target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
  • args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;
  • @within:用于匹配所以持有指定注解类型内的方法;
  • @target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
  • @args:用于匹配当前执行的方法传入的参数持有指定注解的执行;
  • @annotation:用于匹配当前执行方法持有指定注解的方法;
  • bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
  • reference pointcut:表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。
  • AspectJ切入点支持的切入点指示符还有: call、get、set、preinitialization、staticinitialization、initialization、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this、@withincode;但Spring AOP目前不支持这些指示符,使用这些指示符将抛出IllegalArgumentException异常。这些指示符Spring AOP可能会在以后进行扩展。

execution

表达式:注解? 修饰符? 返回值类型 类型声明?方法名(参数列表) 异常列表?

  • 注解:可选,方法上持有的注解,如@Deprecated;
  • 修饰符:可选,如public、protected;
  • 返回值类型:必填,可以是任何类型模式;“*”表示所有类型;
  • 类型声明:可选,可以是任何类型模式;
  • 方法名:必填,可以使用“*”进行模式匹配;
  • 参数列表:“()”表示方法没有任何参数;“(…)”表示匹配接受任意个参数的方法,“(…,java.lang.String)”表示匹配接受java.lang.String类型的参数结束,且其前边可以接受有任意个参数的方法;“(java.lang.String,…)” 表示匹配接受java.lang.String类型的参数开始,且其后边可以接受任意个参数的方法;“(*,java.lang.String)” 表示匹配接受java.lang.String类型的参数结束,且其前边接受有一个任意类型参数的方法;
  • 异常列表:可选,以“throws 异常全限定名列表”声明,异常全限定名列表如有多个以“,”分割,如throws java.lang.IllegalArgumentException, java.lang.ArrayIndexOutOfBoundsException。
  • 示例

    模式

    描述

    public * *(..)

    任何公共方法的执行

    * cn.javass..IPointcutService.*()

    cn.javass包及所有子包下IPointcutService接口中的任何无参方法

    * cn.javass..*.*(..)

    cn.javass包及所有子包下任何类的任何方法

    * cn.javass..IPointcutService.*(*)

    cn.javass包及所有子包下IPointcutService接口的任何只有一个参数方法

    * (!cn.javass..IPointcutService+).*(..)

    非“cn.javass包及所有子包下IPointcutService接口及子类型”的任何方法

    * cn.javass..IPointcutService+.*()

    cn.javass包及所有子包下IPointcutService接口及子类型的的任何无参方法

    * cn.javass..IPointcut*.test*(java.util.Date)

    cn.javass包及所有子包下IPointcut前缀类型的的以test开头的只有一个参数类型为java.util.Date的方法,注意该匹配是根据方法签名的参数类型进行匹配的,而不是根据执行时传入的参数类型决定的

    如定义方法:public void test(Object obj);即使执行时传入java.util.Date,也不会匹配的;

    * cn.javass..IPointcut*.test*(..) throws

    IllegalArgumentException, ArrayIndexOutOfBoundsException

    cn.javass包及所有子包下IPointcut前缀类型的的任何方法,且抛出IllegalArgumentException和ArrayIndexOutOfBoundsException异常

    * (cn.javass..IPointcutService+

    && java.io.Serializable+).*(..)

    任何实现了cn.javass包及所有子包下IPointcutService接口和java.io.Serializable接口的类型的任何方法

    @java.lang.Deprecated * *(..)

    任何持有@java.lang.Deprecated注解的方法

    @java.lang.Deprecated @cn.javass..Secure * *(..)

    任何持有@java.lang.Deprecated和@cn.javass..Secure注解的方法

    @(java.lang.Deprecated || cn.javass..Secure) * *(..)

    任何持有@java.lang.Deprecated或@ cn.javass..Secure注解的方法

    (@cn.javass..Secure *) *(..)

    任何返回值类型持有@cn.javass..Secure的方法

    * (@cn.javass..Secure *).*(..)

    任何定义方法的类型持有@cn.javass..Secure的方法

    * *(@cn.javass..Secure (*) , @cn.javass..Secure (*))

    任何签名带有两个参数的方法,且这个两个参数都被@ Secure标记了,

    如public void test(@Secure String str1,

    @Secure String str1);

    * *((@ cn.javass..Secure *))或

    * *(@ cn.javass..Secure *)

    任何带有一个参数的方法,且该参数类型持有@ cn.javass..Secure;

    如public void test(Model model);且Model类上持有@Secure注解

    * *(

    @cn.javass..Secure (@cn.javass..Secure *) ,

    @ cn.javass..Secure (@cn.javass..Secure *))

    任何带有两个参数的方法,且这两个参数都被@ cn.javass..Secure标记了;且这两个参数的类型上都持有@ cn.javass..Secure;

    * *(

    java.util.Map<cn.javass..Model, cn.javass..Model>

    , ..)

    任何带有一个java.util.Map参数的方法,且该参数类型是以< cn.javass..Model, cn.javass..Model >为泛型参数;注意只匹配第一个参数为java.util.Map,不包括子类型;

    如public void test(HashMap<Model, Model> map, String str);将不匹配,必须使用“* *(

    java.util.HashMap<cn.javass..Model,cn.javass..Model>

    , ..)”进行匹配;

    而public void test(Map map, int i);也将不匹配,因为泛型参数不匹配

    * *(java.util.Collection<@cn.javass..Secure *>)

    任何带有一个参数(类型为java.util.Collection)的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@cn.javass..Secure注解;

    如public void test(Collection<Model> collection);Model类型上持有@cn.javass..Secure

    * *(java.util.Set<? extends HashMap>)

    任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型继承与HashMap;

    Spring AOP目前测试不能正常工作

    * *(java.util.List<? super HashMap>)

    任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型是HashMap的基类型;如public voi test(Map map);

    Spring AOP目前测试不能正常工作

    * *(*<@cn.javass..Secure *>)

    任何带有一个参数的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@cn.javass..Secure注解;

    Spring AOP目前测试不能正常工作

within

使用“within(类型表达式)”匹配指定类型内的方法执行

模式

描述

within(cn.javass..*)

cn.javass包及子包下的任何方法执行

within(cn.javass..IPointcutService+)

cn.javass包或所有子包下IPointcutService类型及子类型的任何方法

within(@cn.javass..Secure *)

持有cn.javass..Secure注解的任何类型的任何方法

必须是在目标对象上声明这个注解,在接口上声明的对它不起作用

this

使用“this(类型全限定名)”匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口方法也可以匹配;注意this中使用的表达式必须是类型全限定名,不支持通配符;

模式

描述

this(cn.javass.spring.chapter6.service.IPointcutService)

当前AOP对象实现了 IPointcutService接口的任何方法

this(cn.javass.spring.chapter6.service.IIntroductionService)

当前AOP对象实现了 IIntroductionService接口的任何方法

也可能是引入接口

target

使用“target(类型全限定名)”匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;注意target中使用的表达式必须是类型全限定名,不支持通配符;

模式

描述

target(cn.javass.spring.chapter6.service.IPointcutService)

当前目标对象(非AOP对象)实现了 IPointcutService接口的任何方法

target(cn.javass.spring.chapter6.service.IIntroductionService)

当前目标对象(非AOP对象) 实现了IIntroductionService 接口的任何方法

不可能是引入接口

args

使用“args(参数类型列表)”匹配当前执行的方法传入的参数为指定类型的执行方法;注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用;

模式

描述

args (java.io.Serializable,..)

任何一个以接受“传入参数类型为 java.io.Serializable” 开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的

@within

使用“@within(注解类型)”匹配所以持有指定注解类型内的方法;注解类型也必须是全限定类型名;

模式

描述

@within cn.javass.spring.chapter6.Secure)

任何目标对象对应的类型持有Secure注解的类方法;

必须是在目标对象上声明这个注解,在接口上声明的对它不起作用

@targe

使用“@target(注解类型)”匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;注解类型也必须是全限定类型名;

模式

描述

@target (cn.javass.spring.chapter6.Secure)

任何目标对象持有Secure注解的类方法;

必须是在目标对象上声明这个注解,在接口上声明的对它不起作用

@args

使用“@args(注解列表)”匹配当前执行的方法传入的参数持有指定注解的执行;注解类型也必须是全限定类型名;

模式

描述

@args (cn.javass.spring.chapter6.Secure)

任何一个只接受一个参数的方法,且方法运行时传入的参数持有注解 cn.javass.spring.chapter6.Secure;动态切入点,类似于arg指示符;

@annotation

使用“@annotation(注解类型)”匹配当前执行方法持有指定注解的方法;注解类型也必须是全限定类型名;

模式

描述

@annotation(cn.javass.spring.chapter6.Secure )

当前执行方法上持有注解 cn.javass.spring.chapter6.Secure将被匹配

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

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

相关文章

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…

Linux - 五种常见I/O模型

I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程. 什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等. 五种常见的 I/O 模型: 阻塞 I/O非阻塞 I/O信号驱动 I/OI/O 多路复用异步 I/O 阻塞 I/O 阻塞 I/O 的特点: 当用户发起 I/O 请求后, 进程/线程就…

问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

【UE5插件】RuntimeSpeechRecognizer

作用&#xff1a;语音识别 获取途径&#xff1a; Runtime Audio Importer | Fab 示例蓝图&#xff1a; 如何使用插件 |Georgy 开发文档 UE5.3 RuntimeSpeechRecognizer Streaming Example posted by gtreshchev | blueprintUE | PasteBin For Unreal Engine RuntimeSpeechReco…

2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程

本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类&#xff1a;DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…

Web3 与数据隐私:如何让用户掌控个人信息

随着数字化时代的快速发展&#xff0c;互联网已经渗透到我们生活的方方面面&#xff0c;个人数据的收集与使用也变得越来越普遍。与此同时&#xff0c;数据隐私问题逐渐成为全球关注的焦点。传统的互联网平台通常将用户的数据存储在中心化的服务器上&#xff0c;这意味着平台拥…

HTML常用属性

HTML标签的常见属性包括许多不同的功能&#xff0c;可以为元素提供附加信息或控制元素的行为。以下是一些常见的属性及其解释&#xff1a; 1. src 描述&#xff1a;src&#xff08;source&#xff09;属性指定一个资源的路径&#xff0c;通常用于图像、音频、视频等标签。常见…

SQL Server 建立每日自动log备份的维护计划

SQLServer数据库可以使用维护计划完成数据库的自动备份&#xff0c;下面以在SQL Server 2012为例说明具体配置方法。 1.启动SQL Server Management Studio&#xff0c;在【对象资源管理器】窗格中选择数据库实例&#xff0c;然后依次选择【管理】→【维护计划】选项&#xff0…

基于 WPF 平台使用纯 C# 实现动态处理 json 字符串

一、引言 在当今的软件开发领域&#xff0c;数据的交换与存储变得愈发频繁&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;以其简洁、易读、便于解析和生成的特点&#xff0c;被广泛应用于各种应用程序中。在 W…

C++—21、C++ 中构造函数Constructors

一、什么是构造函数&#xff1f; 构造函数是一个特殊的方法&#xff0c;它在类每次实例化创建对象的时侯自动调用&#xff0c;用于初始化对象。 构造函数的名字必须与类名完全相同&#xff0c;并且没有返回类型&#xff0c;甚至连void也没有。 构造函数的目的是确保对象在创…

Tensor 基本操作1 unsqueeze, squeeze, softmax | PyTorch 深度学习实战

本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考&#xff1a;https://pytorch.org/tutorials/beginn…

C# HTTP/HTTPS 请求测试小工具

这是一个使用 C# 语言开发的实用小工具&#xff0c;旨在帮助用户轻松测试 HTTP 和 HTTPS 请求。 该工具可以发送各种 HTTP 和 HTTPS 请求&#xff0c;包括但不限于 GET、POST、PUT、DELETE 等常见的请求类型。通过简洁明了的界面或命令行操作&#xff0c;用户可以方便地输入目…

学习英语48个国际音标

学习英语48个国际音标 首先在b站刷到了雪梨老师的视频&#xff0c;感觉很好&#xff1a; 【雪梨老师】48个国际音标的标准发音速记口诀&#xff0c;零基础一定要收藏&#xff01;【建议收藏】_哔哩哔哩_bilibili 雪梨老师的视频朗朗上口&#xff0c;节奏感强&#xff0c;听起…

Kyligence AI 数据智能体:首批亮相神州数码 DC·AI 生态创新中心!

近日&#xff0c;跬智信息&#xff08;Kyligence&#xff09;长期合作伙伴神州数码&#xff0c;其 DCAI 生态创新中心正式启幕。 作为首批生态伙伴&#xff0c;Kyligence AI 数据智能体也正式入驻&#xff0c;在这里首次亮相。 Kyligence 是国内最早推出 AI 用数产品的厂商&a…

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大&#xff0c;像素点越亮。 最后的3表示三个颜色通道&#xff0c;常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…

JVM面试题解,垃圾回收之“分代回收理论”剖析

一、什么是分代回收 我们会把堆内存中的对象间隔一段时间做一次GC&#xff08;即垃圾回收&#xff09;&#xff0c;但是堆内存很大一块&#xff0c;内存布局分为新生代和老年代、其对象的特点不一样&#xff0c;所以回收的策略也应该各不相同 对于“刚出生”的新对象&#xf…

从根源分析,调试,定位和解决MacOS ld: unsupported tapi file type ‘!tapi-tbd‘ in YAML file

你要是遇到同样错误&#xff0c;找一圈都没有解决&#xff0c;建议认真读一下本文&#xff0c;这个应该是最终极的解决办法&#xff0c;从原理上剖析了产生的原因&#xff0c;同时给出来了调试和定位的办法。 maccos使用brew安装了一个gcc14, 结果编译一个最简单的程序都报错&a…