SpringAOP表达式
Posted Q_Y_X
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringAOP表达式相关的知识,希望对你有一定的参考价值。
Spring AOP切点表达式使用介绍
execution表达式
语法格式:execution返回类型 包名 类名 方法名(参数表))
如:
execution(java.lang.String com.qyx.xxx.Service.text(java.lang.String) and args(name))
在类型中有com.qyx.Service.text中有方法test,且参数为String,参数名为name,返回类型为String时增加切面
execution(* com.qyx.Service.*(...))
com.qyx.Service.*(...)类型中的任意方法,任意类型返回结果,参数表不限定,都增加切面
execution应用:最常用,也是最通用的,根据方法执行标准,定义切点,如事务处理,日志处理
target表达式
以目标对象作为切点的表达式定义方法
语法:target(包名.接口名)
如:target(com.qyx.xxx.IA) :所有实现了IA接口的实现类,作为代理的目标对象,会自动增加通知的织入,实现切面。
应用:为某一个接口实现提供配置,如登陆,因为登陆的时候需要执行的附属逻辑时比较多的,在不同的业务流程中,附属逻辑也不同,如 电商中,可能在登陆的时候,需要去执行购物车合并。
this表达式
实现接口的任意代理对象都会作为切点,和target有点类似
语法:this(包名.接口名)
如:this(com.qyx.xxx.IA):代理对象Proxy如果实现了IA接口,则作为其切点
应用:针对某个具体的代理提供的配置,比如target切点粒度细致,因为目标i对象可以多实现,代理对象可以针对目标对象实现的多个接口的某一个接口,提供特定的切点,如 银行项目中的登陆,因为银行的账户种类很多且有交叉,如借记卡 贷记卡 存储卡,可以针对存储卡提供一个切点,做存储信息的记录等
within表达式
以包作为目标定义切点
语法:within(包名.*):代表在包中的任意接口或类型都作为切点
如 within(com.qyx.service.*)
应用:针对某一个包提供的切点,粒度比target粗糙,如 某包的所有接口都需要执行某附属逻辑,如 电商平台中的下订单,下订单服务中可能需要特定的逻辑(时间戳校验,库存校验),这些逻辑,是其他业务线中不需要提供切面的
args表达式
以参数标准作为目标定义切点
语法args(类型,类型,...):代表方法的参数名符合要求的时候,作为切点,参数表时有顺序的
如 args(java.lang,String)
应用:主要应用在参数校验中,如登陆的时候必须传递两个字符串参数(登陆名和密码),可以使用args来限定,配合execution实现,如execution(java.lang.String com.qyx.xxx.Service.text(java.lang.String) and args(name)),使用频率最低的表达式
以上是关于SpringAOP表达式的主要内容,如果未能解决你的问题,请参考以下文章
练习springaop时遇到Java1.8无法使用lambda表达式