本文内容
- Spring 10种切点表达式详解
- 切点的组合使用
- 公共切点的定义
@Poincut("PCD") // 切点表达式 表示对哪些方法进行增强public void pc(){} // 切点签名,返回值必须为void
10种切点表达式AspectJ的切点指示符AspectJ pointcut designators (PCD),也就是俗称的切点表达式,Spring中支持10种,如下表:作用
匹配规则
execution
用于匹配方法执行的连接点
within
用于匹配指定类型内的方法执行
within(x)匹配规则target.getClass().equals(x)
this
【Spring AOP 切点详解】用于匹配当前AOP代理对象类型的执行方法,包含引入的接口类型匹配
this(x)匹配规则:
x.getClass.isAssingableFrom(proxy.getClass)
target
用于匹配当前目标对象类型的执行方法,不包括引入接口的类型匹配
target(x)匹配规则:x.getClass().isAssignableFrom(target.getClass());
args
用于匹配当前执行的方法传入的参数为指定类型的执行方法
传入的目标位置参数.getClass().equals(@args(对应的参数位置的注解类型))!= null
@target
用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解
target.class.getAnnotation(指定的注解类型) != null
@args
用于匹配当前执行的方法传入的参数持有指定注解的执行
传入的目标位置参数.getClass().getAnnotation(@args(对应的参数位置的注解类型))!= null
@within
用于匹配所有持有指定注解类型内的方法
被调用的目标方法Method对象.getDeclaringClass().getAnnotation(within中指定的注解类型) != null
@annotation
用于匹配当前执行方法持有指定注解的方法
target.getClass().getMethod("目标方法名").getDeclaredAnnotation(@annotation(目标注解))!=null
bean
Spring AOP扩展的,AspectJ没有对应的指示符,用于匹配特定名称的Bean对象的执行方法
ApplicationContext.getBean("bean表达式中指定的bean名称") != null
简单介绍下AspectJ中常用的3个通配符:
- *:匹配任何数量的字符
- ..:匹配任何数量字符的重复,如任何数量子包,任何数量方法参数
- +:匹配指定类型及其子类型,仅作为后缀防过载类型模式后面 。
格式说明
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)throws-pattern?)
- 其中带 ?号的 modifiers-pattern?,declaring-type-pattern?,throws-pattern?是可选项
- ret-type-pattern,name-pattern, parameters-pattern是必选项
- modifier-pattern? 修饰符匹配,如public 表示匹配公有方法,*表示任意修饰符
- ret-type-pattern 返回值匹配,* 表示任何返回值,全路径的类名等
- declaring-type-pattern? 类路径匹配
- name-pattern 方法名匹配,* 代表所有,xx*代表以xx开头的所有方法
- (param-pattern) 参数匹配,指定方法参数(声明的类型),(..)代表所有参数,(*,String)代表第一个参数为任何值,第二个为String类型,(..,String)代表最后一个参数是String类型
- throws-pattern? 异常类型匹配
public class PointcutExecution {// com.crab.spring.aop.demo02包下任何类的任意方法@Pointcut("execution(* com.crab.spring.aop.demo02.*.*(..))")public void m1(){}// com.crab.spring.aop.demo02包及其子包下任何类的任意方法@Pointcut("execution(* com.crab.spring.aop.demo02..*.*(..))")public void m2(){}// com.crab.spring.aop包及其子包下IService接口的任意无参方法@Pointcut("execution(* com.crab.spring.aop..IService.*(..))")public void m3(){}// com.crab.spring.aop包及其子包下IService接口及其子类型的任意无参方法@Pointcut("execution(* com.crab.spring.aop..IService+.*(..))")public void m4(){}// com.crab.spring.aop.demo02.UserService类中有且只有一个String参数的方法@Pointcut("execution(* com.crab.spring.aop.demo02.UserService.*(String))")public void m5(){}// com.crab.spring.aop.demo02.UserService类中参数个数为2且最后一个参数类型是String的方法@Pointcut("execution(* com.crab.spring.aop.demo02.UserService.*(*,String))")public void m6(){}// com.crab.spring.aop.demo02.UserService类中最后一个参数类型是String的方法@Pointcut("execution(* com.crab.spring.aop.demo02.UserService.*(..,String))")public void m7(){}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Spring boot heapdump获取敏感信息
- Spring Cloud Stream使用详解及部分重点源码分析
- SpringAOP的切面执行顺序在Spring4和Spring5中有什么区别?
- springcloud 整合openFeign
- 玩转SpringBoot 跨域问题的 3 种方案
- SpringBoot内置Tomcat启动原理源码分析
- Spring Boot 使用自定义注解实现防止表单重复提交
- 国外服务器部署springboot 项目 出现时区问题
- 谁才是微服务赢家:Quarkus 与 Spring Boot
- 使用 Spring 实现策略模式可以这么简单