AOP AspectJ Pointcuts 表达式 语法 示例

AOP AspectJ Pointcuts 表达式 语法 示例

Pointcut语法格式

Pointcut 是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的。

Pointcut可以由下列方式来定义或者通过 && || 和 ! 的方式进行组合。

args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
9

9

 

1

args()

2

@args()

3

execution()

4

this()

5

target()

6

@target()

7

within()

8

@within()

9

@annotation

其中 execution 是用的最多的,其格式为:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
execution(修饰符? 返回值的类型 所属的类? 方法名(参数列表) 抛出的异常?)
 

1

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

2

execution(修饰符? 返回值的类型 所属的类? 方法名(参数列表) 抛出的异常?)

后面带 ? 的表示可以省略,returning type pattern 和 name pattern 和 parameters pattern是必须的。

  • modifiers-pattern:指定方法的修饰符,支持通配符,该部分可以省略
  • ret-type-pattern:指定方法的返回值类型,支持通配符,可以使用 * 通配符来匹配所有的返回值类型
  • declaring-type-pattern:指定方法所属的类,支持通配符,该部分可以省略
  • name-pattern:指定匹配指定的方法名,支持通配符,可以使用 * 通配符来匹配所有方法,也可以用 set* 匹配以 set 开头的所有方法
  • param-pattern:指定方法声明中的形参列表,支持两个通配符,即 * 和 .. ,其中 * 代表一个任意类型的参数,而 .. 代表零个或多个任意类型的参数。例如 :
    () 匹配一个不接受任何参数的方法
    (..) 匹配一个接受任意数量参数的方法
    (*) 匹配了一个接受一个任何类型的参数的方法
    (*,String) 匹配了一个接受两个参数的方法,其中第一个参数是任意类型,第二个参数必须是String类型
  • throws-pattern:指定方法声明抛出的异常,支持通配符,该部分可以省略

通配符和操作符

* 表示任何数量的字符,除了(.)

.. 表示任何数量的字符包括任何数量的(.)

+ 描述指定类型的任何子类或者子接口

同java一样,提供了一元和二元的条件表达操作符。

一元操作符:!

二元操作符:||和&&

优先权同java


案例1

类型签名样式

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 Account.debit(float) throws InsufficientBalanceException
x

 

1

public void Account.debit(float) throws InsufficientBalanceException

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

1

 

1

public void Account.set*(*)

Account中所有的没有参数的public void 方法

public void Account.*()
1

1

 

1

public void Account.*()

Account中所有没有参数的public 方法

public * Account.*()
1

1

 

1

public * Account.*()

Account中所有的public 方法

public * Account.*(..)
1

1

 

1

public * Account.*(..)

Account中的所有方法,包括private方法

* Account.*(..)
1

1

 

1

* Account.*(..)

Account中的所有的非public 方法

!public * Account.*(..)
1

1

 

1

!public * Account.*(..)

Account中的所有的方法,包括子类的方法

* Account+.*(..)
1

1

 

1

* Account+.*(..)

所有的read方法

* java.io.Reader.read(..)
1

1

 

1

* java.io.Reader.read(..)

所有以read(char[])开始的方法,包括read(char[])和read(char[],int,int)

* java.io.Reader.read(char[],..)
1

1

 

1

* java.io.Reader.read(char[],..)

命名以add开始,以Listener结尾的方法,参数中为EventListener或子类

* javax..*.add*Listener(EventListener+)
1

1

 

1

* javax..*.add*Listener(EventListener+)

抛出RemoteException的所有方法

* *.*(..) throws RemoteException
1

1

 

1

* *.*(..) throws RemoteException


构造器签名模式

同上面,
没有参数的构造器方法

public Account.new()
1

1

 

1

public Account.new()


属性签名模式

同方法一样,属性也查不多
所有的Account属性

* Account.*  
1

1

 

1

* Account.*  

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

!public static * banking..*.*
1

1

 

1

!public static * banking..*.*


案例2

任意公共方法的执行:

execution(public * *(..))
1

1

 

1

execution(public * *(..))

任何一个以 set 开始的方法的执行:

execution(* set*(..))
1

1

 

1

execution(* set*(..))

接口
com.xyz.service.
AccountService 中的任意方法的执行:

execution(* com.xyz.service.AccountService.*(..))
1

1

 

1

execution(* com.xyz.service.AccountService.*(..))

定义在 com.xyz.service 包里的任意方法的执行:

execution(* com.xyz.service.*.*(..))
1

1

 

1

execution(* com.xyz.service.*.*(..))

定义在 com.xyz.service 包和所有子包里的任意类的任意方法的执行:

execution(* com.xyz.service..*.*(..))
1

1

 

1

execution(* com.xyz.service..*.*(..))

定义在 com.xyz.pointcutexp 包和所有子包里的 JoinPointObjP2 类的任意方法的执行:

execution(* com.xyz.pointcutexp..JoinPointObjP2.*(..))")
1

1

 

1

execution(* com.xyz.pointcutexp..JoinPointObjP2.*(..))")


2018-4-27
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101696.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 变量放在堆还是栈_堆和栈的共同特点

    变量放在堆还是栈_堆和栈的共同特点内容会持续更新,有错误的地方欢迎指正,谢谢!什么是栈区,什么是堆区栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等,内存的分配是连续的,类似于数组,当我们声明变量时,编译器会自动接着当前栈区的结尾来分配内存。堆区(heap):由程序员分配释放,若程序员不释放,程序结束时由OS回收,内存的分配不是连续的,类似于链表。变量存放的位置C/C++程…

    2025年5月27日
    2
  • 虚拟机桥接模式下设置静态IP地址无法上网

    虚拟机桥接模式下设置静态IP地址无法上网宿主机:win7虚拟机:Fedora24上网:无线路由器+ADSL虚拟机采用桥接模式,之前虚拟机的网卡配置为DHCP模式,通过无线路由器动态分配一个192.168.1.xxx的IP地址,可以上网。由于最近需要虚拟机的IP地址固定,就设置了一个镜头IP地址:192.168.1.30,结果发现虚拟机无法上网了。折腾了半天发现,在vmware的网络编辑器中,不要使用自动,要明确选择桥接到联网的

    2022年6月5日
    55
  • 5.1活动规划_上海市城市规划条例

    5.1活动规划_上海市城市规划条例规划范围管理是为记录如何定义,确认和控制项目范围及产品范围,而创建范围管理计划的过程。本过程的主要作用是:在整个项目期间对如何管理项目提供指南和方向。范围管理计划是项目或项目管理计划的组成部分,描述将如何定义、制定、监督、控制和确认项目范围。 …

    2025年11月26日
    1
  • sql优化的几种方式

    sql优化的几种方式一、为什么要对SQL进行优化我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化,而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。二、SQL优化的一些方法1.对查询进行优化,应尽量避免全表扫描…

    2022年6月22日
    24
  • nonlocal怎么用_result的用法

    nonlocal怎么用_result的用法这个nonlocal是py3.x中才有的关键词第一种情况,不使用nonlocal的情况:#-*-encoding:utf-8-*-importsysreload(sys)sys.setdefaultencoding(‘utf-8’)deftest():x=1print(“test=”+str(x))#####################

    2025年9月20日
    5
  • 如何打开rdb文件

    如何打开rdb文件

    2021年11月3日
    125

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号