@PointCut注解
在使用Spring框架过程中,AOP的使用是难以避免的。利用切面可以设置权限,日志等统一信息。自定义注解,代码可读性会更高,也更加优雅。自定义注解三个关键点注解,切点,解释类。今天我们分享的就是框架中定义切点的注解@PointCut
1、定义
首先@Pointcut是把重用的切点表达式抽取出来。
切点表达式就是告诉切面类,通知方法在什么时候运行的表达式,他能锁定出一个或者一种方法,或者锁定了一个位置出来
所以,当我们有场景需要抽取出来切点表达式的时候,这种表达式必然是有共性的:被切方法在同一包下,或者被切方法修饰符权限相同(比如所有的public方法)等等
常见的@Pointcut()参数是execution(public int com.xxx.xx.xxxx.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(com.xyz.service.*)
其他表达式
任何在com.xyz.service包中得方法
within(com.xyz.service.*)
任何定义在com.xyz.service包或者其子包中的方法
within(com.xyz.service..*)
任何实现了com.xyz.service.AccountService接口中的方法
this(com.xyz.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中所有方法