选择要使用的 AOP 声明样式

一旦你决定了切面是实现给定需求的最佳方法,你如何选择使用 Spring AOP 还是 AspectJ,以及选择 Aspect 语言(代码)风格、@AspectJ 注解风格还是 Spring XML 风格?这些决定受到许多因素的影响,包括应用程序需求、开发工具以及团队对 AOP 的熟悉程度。

Spring AOP 还是完整的 AspectJ?

使用最简单可行的方案。Spring AOP 比使用完整的 AspectJ 更简单,因为它不需要在你的开发和构建过程中引入 AspectJ 编译器/织入器。如果你只需要通知 Spring bean 上操作的执行,Spring AOP 是正确的选择。如果你需要通知不由 Spring 容器管理的对象(例如,通常是领域对象),则需要使用 AspectJ。如果你希望通知除简单方法执行之外的连接点(例如,字段获取或设置连接点等),也需要使用 AspectJ。

当你使用 AspectJ 时,可以选择 AspectJ 语言语法(也称为“代码风格”)或 @AspectJ 注解风格。如果切面在你的设计中扮演重要角色,并且你能够使用 Eclipse 的 AspectJ 开发工具 (AJDT) 插件,那么 AspectJ 语言语法是首选。它更清晰、更简单,因为该语言是专门为编写切面而设计的。如果你不使用 Eclipse,或者只有少量切面在应用程序中不扮演主要角色,你可能需要考虑使用 @AspectJ 风格,坚持在 IDE 中进行常规 Java 编译,并在构建脚本中添加一个切面织入阶段。

Spring AOP 中使用 @AspectJ 还是 XML?

如果你选择使用 Spring AOP,你可以选择 @AspectJ 或 XML 风格。这两种风格各有优缺点。

XML 风格可能对现有的 Spring 用户最为熟悉,并且它由真正的 POJO 支持。当使用 AOP 作为配置企业服务的工具时,XML 可以是一个不错的选择(一个很好的测试是,你是否认为切点表达式是你可能想要独立更改的配置的一部分)。使用 XML 风格,从你的配置中可以更清楚地看出系统中存在哪些切面。

XML 风格有两个缺点。首先,它不能完全在一个地方封装它所解决的需求的实现。DRY 原则指出,系统中的任何知识都应该有一个单一、明确、权威的表示。当使用 XML 风格时,关于需求如何实现的知识分散在支持 bean 类的声明和配置文件中的 XML 中。当使用 @AspectJ 风格时,此信息封装在一个模块中:切面。其次,XML 风格在表达能力上比 @AspectJ 风格稍有限制:只支持“单例”切面实例化模型,并且无法组合在 XML 中声明的命名切点。例如,在 @AspectJ 风格中,你可以这样写:

  • Java

  • Kotlin

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

@Pointcut("execution(com.xyz.Account+ *(..))")
public void operationReturningAnAccount() {}

@Pointcut("propertyAccess() && operationReturningAnAccount()")
public void accountPropertyAccess() {}
@Pointcut("execution(* get*())")
fun propertyAccess() {}

@Pointcut("execution(com.xyz.Account+ *(..))")
fun operationReturningAnAccount() {}

@Pointcut("propertyAccess() && operationReturningAnAccount()")
fun accountPropertyAccess() {}

在 XML 风格中,你可以声明前两个切点

<aop:pointcut id="propertyAccess"
		expression="execution(* get*())"/>

<aop:pointcut id="operationReturningAnAccount"
		expression="execution(com.xyz.Account+ *(..))"/>

XML 方法的缺点是,你不能通过组合这些定义来定义 accountPropertyAccess 切点。

@AspectJ 风格支持额外的实例化模型和更丰富的切点组合。它具有将切面保持为模块化单元的优点。它还具有 @AspectJ 切面可以被 Spring AOP 和 AspectJ 理解(并因此被消费)的优点。因此,如果你以后决定需要 AspectJ 的功能来实现其他需求,你可以轻松地迁移到经典的 AspectJ 设置。通常,Spring 团队更喜欢 @AspectJ 风格用于除简单企业服务配置之外的自定义切面。

© . This site is unofficial and not affiliated with VMware.