Handwritten Spring - AOP 面向切面编程(4)
2023-09-07 04:49:17
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 来增强应用程序的功能,同时保持代码的模块性和可维护性。