来源:http://ljhzzyx.blog.163.com/blog/static/38380312200902952412604/

Spring现在也使用AspectJ的语法:

基本的定义如下:

public pointcut accountOperations:call(* Account.*(..))

1.通配符和pointcut 操作符

* 表示任何数量的字符,除了(.) 
.. 表示任何数量的字符包括任何数量的(.) 
+ 描述指定类型的任何子类或者子接口
同java一样,提供了一元和二元的条件表达操作符。
一元操作符:!
二元操作符:||和&&
优先权同java

2.签名语法

类型签名样式

主要的例子:
Account 类型Account
*Account 使用Account名称结束的类型,如SavingsAccount和CheckingAccount
java.*.Date 类型Date在任何直接的java子包中,如java.util.Date和java.sql.Date
java..* 任何在java包或者所有子包中的类型,如java.awt和java.util或者java.awt.event 和java.util.logging
javax..*Model+ 所有javax包或者子包中以Model结尾的类型和其所有子类,如TableModel,TreeModel。
!vector 所有除了Vector的类型
Vector|| Hashtable Vector或者Hashtable类型
java.util.RandomAccess+ 实现RandomAccess和List的所有子类
&& java.util.List+

方法和构造器签名模式

public void Collection.clear():
在Collection中同样签名的clear方法

public void Account.debit(float) throws InsufficientBalanceException:
Account中同样签名的debit方法

public void Account.set*(*)
Account中以set开头,并且只有一个参数类型的方法

public void Account.*()
Account中所有的没有参数的public void 方法

public * Account.*()
Account中所有没有参数的public 方法

public * Account.*(..)
Account中所有的public 方法

* Account.*(..)
Account中的所有方法,包括private方法

!public * Account.*(..)
所有的非public 方法

* Account+.*(..)
所有的方法,包括子类的方法

* java.io.Reader.read(..)
所有的read方法

* java.io.Reader.read(char[],..)
所有以read(char[])开始的方法,包括read(char[])和read(char[],int,int)

* javax..*.add*Listener(EventListener+)
命名以add开始,以Listener结尾的方法,参数中为EventListener或子类

* *.*(..) throws RemoteException
抛出RemoteException的所有方法

构造器,同上面
public Account.new()
没有参数的构造器方法

属性签名模式 
同方法一样,属性也查不多
* Account.* 
所有的Account属性

!public static * banking..*.*
所有的非public static 属性,在banking的包或者子包中

3.主要的pointcuts类型

分类pointcuts
遵循特定的语法用于捕获每一个种类的可使用连接点。
主要的种类:

方法执行:execution(MethodSignature) 
方法调用:call(MethodSignature) 
构造器执行:execution(ConstructorSignature) 
构造器调用:call(ConstructorSignature) 
类初始化:staticinitialization(TypeSignature) 
属性读操作:get(FieldSignature) 
属性写操作:set(FieldSignature) 
例外处理执行:handler(TypeSignature) 
对象初始化:initialization(ConstructorSignature) 
对象预先初始化:preinitialization(ConstructorSignature) 
Advice执行:adviceexecution()
基于控制流的pointcuts
主要包括两种类型的控制流:
cflow(Pointcut),捕获所有的连接点在指定的方法执行中,包括执行方法本身。
cflowbelow(Pointcut),捕获所有的连接点在指定的方法执行中,除了执行方法本身。

如以下的例子:
cflow(call(* Account.debit(..))
所有的debit方法中的连接点,包括debit方法本身
cflowbelow(call(* Account.debit(..))
所有debit方法中的连接点,除了debit方法本身
cflow(transactedOperations())
所有由transactedOperations捕获的连接点
cflowbelow(execution(Account.new(..))
所有在Account 构造器中执行的连接点

基于词汇结构的连接点
源代码片断。,如within()和withincode()
within :捕获在指定类或者方面中的程序体中的所有连接点,包括内部类。
Withincode:用于捕获在构造器或者方法中的所有连接点,包括在其中的本地类

执行对象连接点
匹配this,和target对象,作为方法被调用的对象。
this(Account),所有Account的实例的执行点,匹配所有的连接点,如方法调用,属性设置,当前的执行对象为Account,或者其子类。
target(Account):匹配所有的连接点,目标对象为Account或其子类。

必须执行相应的类型,不能使用*,或者..通配符。当前静态方法,不能被匹配。

在within()和this()中的区别:
一个是程序体,而另一个为对象执行。

参数pointcuts
用于捕获参数类型的连接点。
args(String,..,int)
args(RemoteException)

条件检测pointcuts
if(System.currentTimeMillis()>triggerTime)

AspectJ5 已经增加了不少语法,主要关于Annotation 的

AspectJ 中的pointcut 语法相关推荐

  1. @AspectJ中的几种通知方式详解

    本文来详细说下@AspectJ中的几种通知方式 文章目录 概述 通知方式说明 一个例子 本文小结 概述 当Spring 2.0发布以后,Spring AOP增加了新的使用方式,Spring AOP集成 ...

  2. @Pointcut语法详解

    @Pointcut语法详解 目录 @Pointcut语法详解 定义 表达式标签 execution execution格式: 例子: AspectJ类型匹配的通配符: within和@within t ...

  3. Spring AOP之pointcut语法

    在文章Spring AOP之术语简介中有提到,pointcut定义了一种模式,用于匹配join point.Spring AOP中使用了AspectJ的pointcut模式定义语言. 声明一个poin ...

  4. struts.xml配置文件中result的语法

    struts.xml配置文件中result的语法:xxxxx Struts2支持的不同类型的返回结果为: Chain Result-->type="chain" 用来处理Ac ...

  5. 《HTML5移动应用开发入门经典》—— 2.4 HTML5中的HTML语法变化

    本节书摘来异步社区<HTML5移动应用开发入门经典>一书中的第2章,第2.4节,作者:[美]Jennifer Kyrnin,更多章节内容可以访问云栖社区"异步社区"公众 ...

  6. webpack打包处理js文件中的高级语法

    前言 在js文件中定义一个User类 import $ from 'jquery' import './css/at.css' import './css/at.less' import './css ...

  7. 配置 postCSS 自动添加 css 的兼容前缀||打包样式表中的图片和字体文件||打包处理 js 文件中的高级语法

    配置 postCSS 自动添加 css 的兼容前缀 ① 运行 npm i postcss-loader autoprefixer -D 命令 ② 在项目根目录中创建 postcss 的配置文件 pos ...

  8. 浅析ios开发中Block块语法的妙用

    事实上,任何一个应用的开发都离不开多线程.而"块"block与GCD就是苹果OC语言中多线程的核心.      一.块的内部结构      在oc中,块语法以闭包的形式存在,每一个 ...

  9. Python中常见的语法糖

    Python中常见的语法糖 知识点导航: 1. 横线分隔符 2. 交换两个变量的值 3. 判断变量是否在范围内 4. 字符串的乘法 5. 列表相加 6. 列表切片 7. 解压序列赋值给多个变量 8. ...

最新文章

  1. Recall(召回率)和 sensitivity(灵敏性)是同一个概念,其他无相同点
  2. boost::iostreams模块测试定义的布尔类型特征
  3. 【数据结构】绪论部分
  4. 《深入理解JVM.2nd》笔记(五):调优案例分析与实战
  5. 知乎热点:数学专业的学霸们毕业后都在做什么
  6. 程序员加班很严重吗?看看国外程序员怎么怼老板!
  7. java 读取txt文件指定行_在Java中读取txt文件中的特定行
  8. confer安装与连接度的计算
  9. STL常用函数总结-set
  10. 《推荐系统笔记(十)》CTR预估以及一般算法介绍(GBDT+LR)
  11. c语言 万年历问题,【数组函数面试题】面试问题:万年历的C语言… - 看准网
  12. html 中的一些知识
  13. DolbyAudio访问杜比音效驱动程序时发生问题,请重新启动计算机或......
  14. python中snip_Snip滚动截屏_腾讯Snip For Mac官方下载-华军软件园
  15. 【Pytorch】量化
  16. 回归中的相关度和决定系数
  17. 大法将致:将Windows Server 2016打造成个人办公系统,WIN2016打造成超级WIN10,WIN2016优化设置
  18. 【T+】畅捷通T+往来单位档案中默认票据类型设置为“必录”
  19. 架构(B站尚硅谷大数据项目实践 电影推荐系统概述)
  20. Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS

热门文章

  1. C#父类与子类(多态性)
  2. TCP/IP网络断和127.0.0.1回网IP概念
  3. 深入浅出vc dll动态链接库
  4. uni-app 微信小程序自定义radio样式
  5. C++爬虫项目爬取图片
  6. 在虚拟机上装win2003 server心得体会
  7. mysql数据库读写操作_一看就会,MySQL数据库的基本操作(二)
  8. python汉诺塔算法_基于Python的汉诺塔求解中途算法
  9. matlab swt函数,matlab swt 函数出错
  10. springboot日志写入mysql_44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】