切入点语法格式

execution([修饰符] 返回值类型 类的全限定名.方法名(参数名)[异常类型])

注意: 修饰符和异常类型可以省略。

切入点通配符

符号说明
*单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
..多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写。用在方法参数中,表示任意参数。用在包名后,表示当前包及其子包路径
+ (不常用)专用于匹配子类类型。用在类名后,表示当前类及其子类;用在接口后,表示当前接口及其实现类
  • 返回值类型*可以代表为任何返回值。如果返回值为对象,则需指定全路径的类名。
  • 方法名
    • *可以代表所有方法。
    • select*代表以 select 开头的所有方法:如selectByName()、selectById()等等
  • 参数名
    • (..)代表任意参数(无参或多参都行);
    • (*)代表只有一个参数,参数类型为任意类型;
    • (*,*)代表有两个参数,且两个参数类型为任意类型;
    • (*,int)代表有两个参数,第一个参数可以为任何类型,第二个为 int 类型。
//指定切入点为项目中任意类的任意方法
execution(* *..*(..))
//指定切入点为com.bighorn包下的所有方法
execution(* com.bighorn.*.*(..))
//指定切入点为service层的所有方法
execution(* com.bighorn.service.*.*(..))
//指定切入点为service层的save开头的方法  
execution(* com.bighorn.service.*.save*(..))
//指定切入点为所有xxxService业务层接口的所有方法
execution(* com.bighorn.*.*Service.*(..))
//指定切入点为所有xxxService业务层接口的select开头的方法
execution(* com.bighorn.*.*Service.select*(..))        

切入点表达式编写技巧

  • 描述切入点通常描述接口,而不描述实现类,如果描述到实现类,就出现紧耦合了
  • 返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述
  • 包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配
  • 接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业务层接口名
  • 方法名书写以动词进行精准匹匹配,名词采用*匹配,例如selectById书写成selectBy*
  • 通常不使用异常作为匹配规则

参考链接