aop切点定义表达式详解

1.execution

可以匹配到方法级别

格式如下:

execution(方法访问权限? 返回值类型 类路径.方法名(参数) 异常类型?)

eg1:完整示例

execution(public java.lang.Boolean com.example.demo.service.IUserService.login(java.lang.String,java.lang.String)throws java.lang.RuntimeException)
  • public代表方法访问权限
  • java.lang.Boolean代表返回值类型
  • com.example.demo.service.IUserService代表类路径
  • login代表方法名
  • (java.lang.String,java.lang.String)代表参数类型
  • throws java.lang.RuntimeException代表异常类型

eg2:返回值使用通配符*

execution(* com.example.demo.service.IUserService.login(java.lang.String,java.lang.String)throws java.lang.RuntimeException)

eg3:类路径使用通配符*

execution(public * com.example.*.service.IUserService.login(java.lang.String,java.lang.String)throws java.lang.RuntimeException)

eg3:类路径使用通配符..*,代表任意的子包

execution(public * com.example..*.IUserService.login(java.lang.String,java.lang.String)throws java.lang.RuntimeException)

eg4:方法名通配符*,代表可以是任意前缀的login方法,也可以是login

execution(public * com.example.*.service.IUserService.*login(java.lang.String,java.lang.String)throws java.lang.RuntimeException)

eg5:参数使用通配符(..),代表任意个参数

execution(public * com.example.*.service.IUserService.login(..)throws java.lang.RuntimeException)

eg6:无参方法()

execution(public * com.example.*.service.IUserService.login()throws java.lang.RuntimeException)

eg7:两个任意的参数(* , *)

execution(public * com.example.demo.service.IUserService.login(*,*)throws java.lang.RuntimeException)

2.within

within只能匹配具体的类,不能匹配到方法级别,还不能是接口

格式如下:

within(类路径)

eg1:基础用法,匹配到UserServiceImpl这个类

within(com.example.demo.service.impl.UserServiceImpl)

eg2:使用通配符,和execution的类路径通配符一致..*代表任意的包和子包,*Impl代表可以是任意前缀的Impl结尾的类

within(com..*.*Impl)

3.this

匹配接口或者具体执行的类,可以使用通配符,见within中的通配符用法

如果具体的执行类没有定义或重写[执行方法]是无法匹配到的,可以使用target

this(类路径)

eg:

// 匹配接口
this(com.example.demo.service.IUserService)

// 匹配具体类
this(com.example.demo.service.impl.UserServiceImpl)

4.target

匹配接口或者具体执行的类、具体执行的类的父类,可以使用通配符,见within中的通配符用法

使用方法与this类似

target(类路径)

eg:

// 匹配接口
target(com.example.demo.service.IUserService)

// 匹配具体类
target(com.example.demo.service.impl.UserServiceImpl)

5.args

方法上的指定参数类型,注意:要先匹配到某些类,不然会报错,也就是不能单独用

eg1:匹配UserServiceImpl类下参数为两个String类型的方法

within(com.example.demo.service.impl.UserServiceImpl) && args(java.lang.String,java.lang.String)

eg2:错误的使用方法(单独使用)

args(java.lang.String)

6.bean

匹配bean为指定的bean类

格式如下,允许使用通配符*

bean(beanName)

eg:

bean(userService)

bean(*Service)

7.@args

方法上的参数的注解,注意是参数的类上的注解

非方法参数前面有有注解,

错误示例:

void save(@XXAnnotation Param param)

需要Param类上面有注解

eg1:匹配参数类上有@XXAnnotation注解

within(com.example.demo.service.impl.UserServiceImpl) && @args(com.example.demo.annotation.XXAnnotation)

8.@target

在springboot项目中使用启动报错

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.AutoConfigurationPackages': 

9.@within

匹配具体执行方法的类上面的注解,不能匹配到方法级别,接口上加注解是匹配不到的同within效果类似,不支持通配符

@within(注解)

eg:匹配所有方法上方带有XXXAnnotation的注解

@within(com.example.demo.XXXAnnotation)

10.@annotation

方法上面的注解,不支持通配符

@annotation(注解)

eg:匹配所有方法上方带有XXXAnnotation的注解

@annotation(com.example.demo.XXXAnnotation)

11.组合表达式

切入点表达式可以使用“&&”、“||”和“!”进行组合

  • &&条件之间是且的关系
  • ||条件之间是或的关系
  • ! 条件取反

eg1:匹配UserServiceImpl类并且方法方法上带有XXXAnnotation注解的方法

within(com.example.demo.service.impl.UserServiceImpl) && @annotation(com.example.demo.XXXAnnotation)

eg2:匹配UserServiceImpl类或者方法方法上带有XXXAnnotation注解的方法

within(com.example.demo.service.impl.UserServiceImpl) && @annotation(com.example.demo.XXXAnnotation)

eg3:匹配UserServiceImpl类并且方法方法上没有XXXAnnotation注解的方法

within(com.example.demo.service.impl.UserServiceImpl) && !@annotation(com.example.demo.XXXAnnotation)
posted @ 2022-11-30 21:43  linmt  阅读(290)  评论(1编辑  收藏  举报