@Pointcut注解

首先原文链接:https://my.oschina.net/u/2474629/blog/1083448

总结的非常到位,借鉴一下。

首先@Pointcut是把重用的切点表达式抽取出来。

不使用@PointCut的时候,我们需要在切面类通过切点表达式来锁定通知方法在那里运行(锁定业务逻辑切入点)。如果定义了@PointCut(xxx自定义注解@A),就不需要在切面类的通知方法上写切点表达式,而是在业务逻辑代码的方法上打上@A的注解,告诉切面类,这个是你要找的切入点

  什么是切点表达式?顾名思义,切点表达式就是告诉切面类,通知方法在什么时候运行的 表达式,他能锁定出一个或者一种方法,或者说锁定了一个位置出来。

  所以,当我们有场景需要抽取出来切点表达式的时候,这种表达式必然是有共性的:被切方法在同一包下、或者被切方法修饰符权限相同(比如所有的public方法)等等。。。

  常见的@Pointcut()参数是execution(public int com.xxxx.xx.add(int,*))写到参数表里匹配任意一个参数:第一个是int类型,第二个任意类型。接下来就借鉴一下别人总结的,注解的参数中多种其他的表达方式构建切点表达式:

execution表达式

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

上面的就是execution表达式的格式,execution匹配的就是连接点(Joinpoint,一般是方法),看上面的表达式execution是固定的,方法的修饰符是可选的,返回类型是必须的,定义的全限类型也是可选的,名称是必须的,参数是必须的,这些都可以使用通配符。

任何的public方法

execution(public * *(..))

以set开始的方法

execution(* set*(..))

定义在cn.freemethod.business.pack.Say接口中的方法

execution(* cn.freemethod.business.pack.Say.*(..))

任何cn.freemethod.business包中的方法

execution(* cn.freemethod.business.*.*(..))

任何定义在com.xyz.service包或者其子包中的方法

execution(* cn.freemethod.business..*.*(..))

其他表达式

任何在com.xyz.service包中的方法

within(com.xyz.service.*)

任何定义在com.xyz.service包或者其子包中的方法

within(com.xyz.service..*)

任何实现了com.xyz.service.AccountService接口中的方法

this(com.xyz.service.AccountService)

任何目标对象实现了com.xyz.service.AccountService的方法

target(com.xyz.service.AccountService)

一般情况下代理类(Proxy)和目标类(Target)都实现了相同的接口,所以上面的2个基本是等效的。

有且只有一个Serializable参数的方法

args(java.io.Serializable)

只要这个参数实现了java.io.Serializable接口就可以,不管是java.io.Serializable还是Integer,还是String都可以。

目标(target)使用了@Transactional注解的方法

@target(org.springframework.transaction.annotation.Transactional)

目标类(target)如果有Transactional注解中的所有方法

@within(org.springframework.transaction.annotation.Transactional)

任何方法有Transactional注解的方法

@annotation(org.springframework.transaction.annotation.Transactional)

有且仅有一个参数并且参数上类型上有Transactional注解

@args(org.springframework.transaction.annotation.Transactional)

注意是参数类型上有Transactional注解,而不是方法的参数上有注解。

bean的名字为tradeService中的方法

bean(simpleSay)

bean名字为simpleSay中的所有方法。

bean名字能匹配

bean(*Impl)

bean名字匹配*Impl的bean中的所有方法。

posted @ 2021-08-24 10:43  Timeouting  阅读(10600)  评论(0编辑  收藏  举报