写点什么

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

作者:Java你猿哥
  • 2023-04-03
    湖南
  • 本文字数:1519 字

    阅读完需:约 5 分钟

又是一季金三银四,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(匹配指定参数类型的方法)等。


2. 通知(advice)

通知是在切点匹配的位置执行的代码块。通知可以在目标方法执行之前、之后或者发生异常时执行。在 Spring 框架中,通知可以通过以下方式进行声明:

@Before("serviceMethod()")public void doBefore() {    // 在目标方法执行之前执行的代码}
复制代码

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

Spring 支持的通知类型包括:

  • @Before:在目标方法执行之前执行

  • @After:在目标方法执行之后执行,无论是否发生异常

  • @AfterReturning:在目标方法正常执行并返回结果时执行

  • @AfterThrowing:在目标方法抛出异常时执行

  • @Around:可以完全控制目标方法的执行过程,包括是否执行目标方法,以及在何时执行目标方法。

3. 切点表达式(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 动态代理可以对任何类进行代理。

2. AOP 切面

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

3. AOP 顺序

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

4. AOP 异常处理

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

5. AOP 表达式语言(EL)

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


用户头像

Java你猿哥

关注

一只在编程路上渐行渐远的程序猿 2023-03-09 加入

关注我,了解更多Java、架构、Spring等知识

评论

发布
暂无评论
又是一季金三银四,Spring之AOP知识要点总结_spring_Java你猿哥_InfoQ写作社区