返回

解析 Spring AOP 切点,揭秘其组合使用的秘诀

后端

Spring AOP 是一项强大的技术,它允许我们在不修改源代码的情况下增强应用程序的功能。在 Spring AOP 中,切点(Pointcut)是一个非常重要的概念,它指定了应该应用增强(Advice)的连接点(Joinpoint)。在本文中,我们将详细探讨 Spring AOP 切点,包括 10 种切点表达式的详解、切点的组合使用技巧以及公共切点的定义。

10 种切点表达式详解

Spring AOP 提供了 10 种切点表达式,它们可以用于指定不同的连接点。这些表达式包括:

  • execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern)?):匹配方法执行的连接点。
  • call(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern)?):匹配方法调用的连接点。
  • within(type-pattern):匹配指定类型及其子类的所有方法执行的连接点。
  • @within(annotation-type):匹配标记了指定注解类型及其子注解类型的方法执行的连接点。
  • this(pointcut):匹配指定切点表达式匹配的方法执行的连接点。
  • target(pointcut):匹配指定切点表达式匹配的目标对象的方法执行的连接点。
  • args(arguments-pattern...):匹配方法参数满足指定模式的方法执行的连接点。
  • @args(annotation-type...):匹配方法参数标记了指定注解类型及其子注解类型的方法执行的连接点。
  • bean(bean-name-pattern):匹配指定 bean 名称的 bean 的所有方法执行的连接点。
  • @bean(annotation-type):匹配标记了指定注解类型及其子注解类型的方法执行的连接点。

切点的组合使用

Spring AOP 还允许我们组合使用多个切点表达式来指定更复杂的连接点。我们可以使用 &&||! 运算符来组合切点表达式。

  • && 运算符:当且仅当两个切点表达式都匹配时,组合后的切点表达式才匹配。
  • || 运算符:当两个切点表达式中的任何一个匹配时,组合后的切点表达式都匹配。
  • ! 运算符:当且仅当两个切点表达式中的任何一个都不匹配时,组合后的切点表达式才匹配。

例如,我们可以使用以下切点表达式来匹配所有以 get 开头的方法执行的连接点:

execution(* get*(..))

我们可以使用以下切点表达式来匹配所有标记了 @Cacheable 注解的方法执行的连接点:

@annotation(org.springframework.cache.annotation.Cacheable)

我们可以使用以下切点表达式来匹配所有标记了 @Cacheable 注解并且以 get 开头的方法执行的连接点:

@annotation(org.springframework.cache.annotation.Cacheable) && execution(* get*(..))

公共切点的定义

公共切点是指可以被多个增强(Advice)重用的切点。我们可以使用 @Pointcut 注解来定义公共切点。例如,我们可以使用以下代码来定义一个公共切点,匹配所有以 get 开头的方法执行的连接点:

@Pointcut("execution(* get*(..))")
public void getAllMethods() {}

然后,我们可以使用以下代码来应用这个公共切点:

@Around("getAllMethods()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    // do something before the method execution
    Object result = joinPoint.proceed();
    // do something after the method execution
    return result;
}

结语

Spring AOP 切点是一个非常强大的工具,它允许我们指定需要增强的方法执行的连接点。通过理解和掌握切点表达式的使用,我们可以更好地利用 Spring AOP 来增强应用程序的功能。