目录
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)
标签:lang,java,service,demo,切点,详解,aop,com,example
From: https://www.cnblogs.com/linmt/p/16939865.html