返回

Handwritten Spring - AOP 面向切面编程(4)

见解分享

Spring AOP 面向切面编程(4)

掌握 Aspect-Oriented Programming(AOP)的技术对于任何 Java 开发人员而言都是至关重要的。Spring 框架通过其 AOP 模块提供了强大的支持,使我们能够以声明性方式实现交叉关注。在这一系列的博文中,我们深入探讨了 Spring AOP 的基础知识,在本篇中,我们将重点关注 Advisor 包及其在 AOP 中的作用。

Advisor:通知者的扩展

在上一篇文章中,我们了解了 Advisor.java,它是通知者和基于 AspectJ 语法的 Advisor 的抽象类。由于通知者有多种类型,因此在扩展时需要定义不同的实现方式来定义不同的通知者。

通知者的类型

Spring 提供了广泛的通知者类型,每个类型都具有特定功能:

  • MethodBeforeAdvice: 在目标方法执行之前执行。
  • MethodAfterAdvice: 在目标方法执行之后执行。
  • MethodAfterReturningAdvice: 在目标方法成功执行后执行。
  • MethodAfterThrowingAdvice: 在目标方法抛出异常后执行。
  • AroundAdvice: 在目标方法执行前后完全包围目标方法执行。

AspectJ Pointcut:切入点表达

AspectJ Pointcut 是 AspectJ 语法的一部分,用于定义方法或其他代码块的匹配条件。它允许我们指定 AOP 应该应用于代码的哪些部分。

在 Spring AOP 中,Pointcut 由 PointcutExpression 类表示,它提供了基于字符串的表达式语言来定义切入点。例如,以下切入点匹配所有以 get 开头的公共方法:

execution(public * get*())

组合通知者和切入点

Advisor 将通知者和切入点表达式组合在一起,形成一个完整的 AOP 配置。它指定应该应用哪些通知,以及在哪些代码元素上应用它们。

在 Spring AOP 中,可以通过多种方式创建 Advisor:

  • DefaultPointcutAdvisor: 创建具有单个切入点和通知者的 Advisor。
  • PointcutAdvisor: 使用自定义 PointcutExpression 创建 Advisor。
  • IntroductionAdvisor: 创建一个 Advisor,它将新接口或实现添加到目标类。

应用 Advisor

Advisor 可以应用于各种目标对象:

  • 单个 bean: 使用 @AspectJ 注解或 AdvisorAutoProxyCreator 自动应用 Advisor。
  • bean 的集合: 使用 BeanFactoryPostProcessor 手动应用 Advisor。
  • 整个应用程序上下文: 使用 GlobalMethodPointcutAdvisor 创建全局 Advisor。

结论

Advisor 是 Spring AOP 中必不可少的部分,它允许我们定义和应用各种通知者,以及通过切入点表达式指定它们应该应用的代码元素。通过理解 Advisor 的作用,我们可以有效地利用 AOP 来增强应用程序的功能,同时保持代码的模块性和可维护性。