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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python怎么换行输出的数字对齐_print语句输出换行,format格式化输出「建议收藏」

    print其实本来挺简单的一个函数,奈何每次用都忘记了怎么换行输出,所以想想算了还是自己做个记录,免得每次都要去查.print函数用法:print(value,…,sep=”,end=’\n’,file=sys.stdout,flush=False)Printsthevaluestoastream,ortosys.stdoutbydefault.Optiona…

    2022年4月15日
    164
  • decltype函数_decltype有什么用

    decltype函数_decltype有什么用前言如果想要知道一个表达式的数据类型但又不想对表达式进行求值,那么auto似乎就不满足这中要求,c++11加入了decltype操作符,它的功能与auto类似,都是进行类型推导,但是decltype就能对某一表达式的类型进行推导并且不求表达式的值.因为decltype在很多的时候并不同于auto操作符,所以我会将大部分的不同罗列出来,比如:数组,顶层const等.declt…

    2025年10月11日
    3
  • Vue+Element UI 商城后台管理系统[通俗易懂]

    Vue+Element UI 商城后台管理系统[通俗易懂]Vue+ElementUI商城后台管理系统一、前言1.项目背景此项目来自B站Vue实战项目:电商管理系统(Element-UI)。此项目的功能与后端提供的接口并不完全相同,根据后端接口进行开发并添加了部分功能从而进行修改。在完成此项目并测试上线后,在这里记录一下项目的开发思路,以及遇到的一些问题。自我感觉这个项目是一个很不错的关于Vue+ElementUI的练手项目2.部分效果图展示先放一些效果图项目上线地址:https://aerowang.cn/vue_shop

    2025年5月27日
    4
  • matlab画图函数 增加横纵坐标名称_matlab函数绘图

    matlab画图函数 增加横纵坐标名称_matlab函数绘图1.多子图figuresubplot(2,1,1);plot(data1);title(‘原始信号’);%标题subplot(2,1,2);plot(data1_rebuild);title(‘去噪声后信号’);2.多条信号figureplot(data1,’-r’);holdonplot(data1_rebuild,’-b’);legend(‘原始信号’,’去噪后信…

    2026年1月28日
    4
  • Springboot thymeleaf热部署[通俗易懂]

    Springboot thymeleaf热部署[通俗易懂]缘起在实际开发中我们希望能更改代码后立刻看到效果,而无需重启应用。操作1、在配置文件中新增spring:thymeleaf:cache:false2、在pom.xml中加入DEV-tools依赖<!–让项目支持热更新–><dependency><groupId>org.springframework.boot&l…

    2022年5月21日
    82
  • bs与cs的区别简述_cs客户端和bs客户端

    bs与cs的区别简述_cs客户端和bs客户端荐java适合开发bs结构,cs不是它的强项.C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或SQLServer。客户端需要安装专用的客户端软件。B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如NetscapeNavigator或Internet…

    2022年10月16日
    3

发表回复

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

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