又是一季金三银四,Spring之AOP知识要点总结

在这里插入图片描述
在Spring框架中,AOP(面向切面编程)是一个重要的组件,它提供了一种有效的方法来解决横切关注点(cross-cutting concerns)的问题,例如日志记录、安全性、事务处理等。AOP的实现依赖于三个关键的概念:切点(pointcut)、通知(advice)和切点表达式(pointcut expression)。

  1. 切点(pointcut)
    切点是AOP中最基本的概念之一,它指定了在哪些地方和何时执行通知。通俗来讲,切点就是一组条件,这些条件会匹配程序中的某些位置。当程序运行到这些位置时,与之关联的通知会被执行。

在Spring框架中,切点可以通过以下方式进行声明:

@Pointcut("execution(* com.example.service.*.*(..))")
private void serviceMethod() {
    
    }

在上述代码中,@Pointcut注解用于声明一个切点,这个切点指定了匹配所有com.example.service包中任意类的任意方法。切点表达式中的*表示任意字符,…表示任意数量的参数。这个切点可以匹配类似
com.example.service.UserService.addUser(String name)这样的方法。

除了execution表达式之外,Spring还支持其他类型的切点,例如within(匹配指定包中的所有方法)、args(匹配指定参数类型的方法)等。

  1. 通知(advice)
    通知是在切点匹配的位置执行的代码块。通知可以在目标方法执行之前、之后或者发生异常时执行。在Spring框架中,通知可以通过以下方式进行声明:
@Before("serviceMethod()")
public void doBefore() {
    
    
    // 在目标方法执行之前执行的代码
}

在上述代码中,@Before注解用于声明一个前置通知(before advice),这个通知会在serviceMethod()切点匹配的位置执行。在这个例子中,我们执行了一些代码来记录请求的一些参数信息。

Spring支持的通知类型包括:

  • @Before:在目标方法执行之前执行
  • @After:在目标方法执行之后执行,无论是否发生异常
  • @AfterReturning:在目标方法正常执行并返回结果时执行
  • @AfterThrowing:在目标方法抛出异常时执行
  • @Around:可以完全控制目标方法的执行过程,包括是否执行目标方法,以及在何时执行目标方法。
  1. 切点表达式(pointcut)
    切点表达式用于指定切点的匹配规则。在Spring AOP中,切点表达式是一个字符串,用于描述要匹配的切点的规则。切点表达式中包含多个关键字和符号,例如通配符(*)、逻辑运算符(&&、||、!)、参数匹配符(args())、方法匹配符(execution())、类型匹配符(within())等。

下面是一个使用切点表达式的例子:

@Pointcut("execution(* com.example.service.*.*(..)) && args(name,..)")
private void serviceMethod(String name) {
    
    }

在上述代码中,我们使用了两个关键字:execution和args。execution用于匹配指定包下的方法,*通配符表示匹配任意方法名。args用于匹配指定类型的参数,这里我们使用了name参数来限制匹配。

知识要点

除了上述三个关键概念外,还有一些与Spring AOP相关的知识点:

  1. AOP代理

Spring框架使用动态代理来实现AOP,它可以代理目标对象并在方法执行前后添加通知。Spring支持两种代理方式:JDK动态代理和CGLIB动态代理。JDK动态代理要求目标对象必须实现一个接口,而CGLIB动态代理可以对任何类进行代理。

  1. AOP切面

切面是AOP的一个重要概念,它是通知和切点的组合。一个切面可以包含多个通知和多个切点,用于描述一组关注点。

扫描二维码关注公众号,回复: 15144417 查看本文章
  1. AOP顺序

Spring AOP中的通知可以通过@Order注解来指定执行顺序。如果不指定顺序,则按照通知类型的默认顺序执行。

  1. AOP异常处理

当目标方法抛出异常时,Spring AOP可以通过@AfterThrowing注解来捕获异常并执行指定的通知。

  1. AOP表达式语言(EL)

Spring AOP支持使用表达式语言(EL)来定义切点表达式。EL语言是一种简单的表达式语言,用于在运行时动态地计算表达式的值。使用EL语言可以更方便地定义切点表达式,使得代码更易于维护。

猜你喜欢

转载自blog.csdn.net/KRYST4L123/article/details/129928178