一旦你决定一个方面是实现给定的最佳方法 要求,您如何在使用 Spring AOP 或 AspectJ 之间以及在 方面语言(代码)样式,@AspectJ注释样式,还是Spring XML样式?这些 决策受许多因素的影响,包括应用要求、 开发工具,以及团队对 AOP 的熟悉程度。
Spring AOP 还是 Full AspectJ?
使用最简单可行的方法。Spring AOP 比使用完整的 AspectJ 更简单,因为 无需将 AspectJ 编译器/weaver 引入您的开发中 并构建流程。如果您只需要建议在 Spring 上执行操作 豆子,Spring AOP是正确的选择。如果需要告知不受 Spring 容器(例如域对象,通常),您需要使用 方面J。如果您希望建议连接点以外的连接点,您还需要使用 AspectJ 简单的方法执行(例如,字段 get 或 set 连接点等)。
使用 AspectJ 时,可以选择 AspectJ 语言语法(也称为 “代码样式”)或@AspectJ注释样式。如果方面发挥很大 角色,并且您可以使用 AspectJ Eclipse 的开发工具 (AJDT) 插件,AspectJ 语言语法是 首选选项。它更干净、更简单,因为语言是有目的的 专为写作方面而设计。如果您不使用 Eclipse 或只有几个方面 在您的应用程序中不起主要作用,您可能需要考虑使用 @AspectJ风格,坚持在 IDE 中使用常规 Java 编译,并添加 构建脚本的一个方面编织阶段。
Spring AOP @AspectJ 还是 XML?
如果选择使用 Spring AOP,则可以选择 @AspectJ 或 XML 样式。 需要考虑各种权衡。
XML 样式可能是现有 Spring 用户最熟悉的,它由 genuine POJO的。当使用 AOP 作为配置企业服务的工具时,XML 可能是一个很好的 选择(一个很好的测试是你是否认为 pointcut 表达式是 您可能希望单独更改的配置)。使用 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 样式来处理自定义方面,而不是简单的 配置企业服务。