一:在函数入参中使用通配符

@AspectJ支持3种通配符

*:匹配任意字符,但它只能匹配上下文中的一个元素.

.. :匹配任意字符,可以匹配上下文中多个元素,但在表示类时,必须和*联合使用,而在表示入参时则单独使用

+:表示按类型匹配指定类的所有类,必须跟在类名后面,如com.smart.Car+ ;继承或扩展指定类的所有类,同时还包括指定类本身.

@AspectJ函数按其是否支持通配符及支持的程度,可以分为以下3类.

1):支持所有的通配符:execution(),within()

2):仅支持“+”通配符:args(),this(),target()

3):不支持通配符:@args(),within(),target();@annotation()

此外,args(),this(),target(),@args(),@within(),@target()和@annotation()这7个函数除了可以指定类名外,也可以指定变量名,并将目标对象中的变量绑定到增强的方法中.

二:切点函数详解

[1]:@annotation()

@annotation()表示标注了某个注解的所有方法.

eg:

packagecom.springboot.test;importorg.aspectj.lang.annotation.AfterReturning;importorg.aspectj.lang.annotation.Aspect;importorg.springframework.stereotype.Component;

@Aspect

@Componentpublic classTestAspect {

@AfterReturning("@annotation(com.springboot.anno.NeedTest)")public voidneedTestFun() {

System.out.println("needTestFun() executed!");

}

}

[2]:execution()

execution()是最常用的切点函数,其语法如下:

execution(?() ?)

除了返回类型模式,方法名模式,参数模式外,其他项都是可选的.

(1):通过方法签名定义切点

execution(public * *(..)):匹配所有目标类的public方法,第一个*代表返回类型,第二个*代表方法名,而..代表任意入参的方法.

execution(* *To(..)):匹配所有以To为后缀的方法,第一个*代表返回类型,而*To代表任意以To为后缀的方法.

(2):通过类定义切点

execution(* com.springboot.Waiter.*(..)):匹配Waiter接口的所有方法,第一个*代表返回任意类型;com.springboot.Waiter.*(..)代表Waiter接口的所有方法,

(3):通过类包定义切点

在类名模式串中,“.*”表示包下所有的类,而“..*”表示包,子孙包下的所有类.

execution(* com.smart.*(..)):匹配com.smart包下的所有类的所有方法.

execution(* com.smart..*(..)):匹配com.smart包.子孙包下所有的类的所有方法.

execution(* com..*.*Dao.find*(..)):匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名必须以find为前缀.如:com.smart.UserDao#findByUserId(),   com.smart.dao.ForumDao#findById()等.

(4):通过方法入参定义切点:

切点表达式中的方法入参部分比较复杂,可以使用“*”,“..”通配符.其中“*”表示任意类型的参数;而“..”表示任意类型的参数且参数个数不限.

execution(* joke(String,int)):匹配joke(String str,int d)方法.

execution(* joke(String,*):匹配目标类中的joke(),但该方法的第一个入参为String类型,第二个入参可以是任意类型.

execution(* joke(String,..)):匹配目标类中的joke(),该方法的第一个入参为String类型,后面可以有任意个入参,且入参类型不受限制.

execution(* joke(Object+)):匹配目标类中的joke(),方法拥有一个入参,且入参是Object类型或该类的子类.

[3]:args()和@args()

args():该函数接收一个类名,表示目标类方法入参对象是指定类(包含字类)时,切点匹配

1):args(com.smart.Waiter)表示运行时入参是Waiter类型的方法, 其等价于execution(* *(com.smart.Waiter+))当然也等价于args(com.smart.Waiter+).

2):@args() 太啰嗦,不打字了...

[4]:within()

通过类匹配模式串声明切点,within()函数定义的连接点是针对目标类而言的,而非针对运行期对象的类型而言,这一点和execution()是相同的.但和execution()函数不同的是,within()所指定的连接点的最小范围只能是类,二execution()所指定的连接点可以大到包,小到方法入参.所以从某种意义上说,execution()函数的功能涵盖了within()函数的功能.within()函数语法如下:

within()

within(com.smart.NativeWaiter): 匹配目标类NativeWaiter的所有方法.

within(com.smart.*):  匹配com.smart包中的所有类,但不包括子孙包,所以com.smart.service包中类的方法不匹配这个切点

within(co.smart..*):  匹配com.smart包及子孙包中的类,所以com.smart.service,com.smart.dao,com.smart.service.forum等包中的所有类都匹配这个切点.

[5]@within() ,@target()不解释,太啰嗦了...

[6]target(),this()后续补充...

java aop 切点_SpringAOP 切点函数详解相关推荐

  1. java实现instr_Oracle的instr()函数详解

    Oracle的instr()函数详解 1.instr()函数的格式 (俗称:字符查找函数) 格式一:instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式 ...

  2. java的匿名函数_JAVA语言中的匿名函数详解

    本文主要向大家介绍了JAVA语言中的匿名函数详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 一.使用匿名内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: ...

  3. @AspectJ切点函数详解

    @AspectJ切点函数详解 1 方法切点函数 1.1 execution() 1.1.1 通过方法签名定义切点 1.1.2 通过类定义切点 1.1.3 通过类包定义切点 1.1.4 通过方法入参定义 ...

  4. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  5. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  6. c语言memset对应java,C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即"内存"(memory)的意思. ...

  7. 【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within(已附源码)

    文章目录 前言 @within 完善打印日志案例 @within深入说明 within 匹配指定类 匹配指定包(package) 源码下载 总结 前言 在微服务流行的当下,在使用Spring Clou ...

  8. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  9. java集合框架史上最详解(list set 以及map)

    title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...

最新文章

  1. ORACLE导入Excel数据
  2. scikit正则化 API
  3. python利用scapy模块写一个TCP路由追踪和扫描存活IP的脚本
  4. 结构型模式:代理模式
  5. 全球及中国汽车卡钳行业产销需求现状与投资策略分析报告2022年版
  6. CPU 乱序执行验证
  7. php表格之间设置间隔,html表格如何设置间距
  8. 如何找到SAP Spartacus UI可以扩展的outlet
  9. [wordpress]更新插件时,免去FTP操作
  10. 通俗易懂!视觉slam第一部分——slam简介与相机介绍
  11. 西贝莜面村如何建立自己的私域流量池?
  12. 快速开发框架介绍-懂你的RUOYI
  13. 深圳中专计算机专业排名,深圳十大民办中专排行2019
  14. pycharm主题方案
  15. 十四步实现强大的五子棋AI
  16. 菲氏微积分与Keisler微积分:两个不同时代的微积分教材
  17. 电脑蓝屏问题处理,主要是引导修复
  18. SPIR-V 研究:编译器基本原理(二)
  19. 40.凉鞋问题 11月21日
  20. 微信公众号Java开发记录(二)接收、回复消息

热门文章

  1. Apr.6th.08 拜山
  2. Python:09设计Circle类包括圆心半径、颜色属性,编写类方法计算周长与面积(2种方法)
  3. 广度优先搜索[新手易懂]
  4. linux启动挂载磁盘失败,Linux emergency mode-启动中硬盘挂载出错
  5. android3d动画的实现,【转】Android 实现3d动画旋转效果
  6. 三维点云学习(3)6- 实现K-Means
  7. 学习python第十一节课:函数(三)
  8. 关于中国神化体系的建立问题
  9. 日记本浸水:( 改用电子的:)
  10. Java SE Java EE Java ME