Spring AOP 功能与目标
Spring AOP 是用纯 Java 实现的。无需特殊的编译过程。Spring AOP 不需要控制类加载器层次结构,因此适合在 servlet 容器或应用服务器中使用。
Spring AOP 目前仅支持方法执行连接点(对 Spring bean 上方法的执行进行通知)。字段拦截尚未实现,尽管可以在不破坏核心 Spring AOP API 的情况下添加对字段拦截的支持。如果您需要对字段访问和更新连接点进行通知,请考虑使用 AspectJ 等语言。
Spring AOP 的 AOP 方法与大多数其他 AOP 框架有所不同。其目标不是提供最完整的 AOP 实现(尽管 Spring AOP 非常强大)。而是旨在提供 AOP 实现与 Spring IoC 之间的紧密集成,以帮助解决企业应用中的常见问题。
因此,例如,Spring Framework 的 AOP 功能通常与 Spring IoC 容器一起使用。切面是通过使用普通的 bean 定义语法进行配置的(尽管这允许强大的 "自动代理" 功能)。这是与其他 AOP 实现的一个关键区别。使用 Spring AOP,您无法轻松或高效地完成某些事情,例如建议非常细粒度的对象(通常是领域对象)。在这种情况下,AspectJ 是最佳选择。然而,我们的经验是,Spring AOP 为大多数适合 AOP 的企业 Java 应用程序提供了出色的解决方案。
Spring AOP 从不试图与 AspectJ 竞争,以提供全面的 AOP 解决方案。我们相信,基于代理的框架,如 Spring AOP 和完整的框架,如 AspectJ,都是有价值的,它们是互补的,而不是竞争关系。Spring 无缝集成了 Spring AOP 和 IoC 与 AspectJ,以便在一致的基于 Spring 的应用程序架构中启用所有 AOP 的使用。这种集成不会影响 Spring AOP API 或 AOP Alliance API。Spring AOP 仍然向后兼容。有关 Spring AOP APIs 的讨论,请参见 the following chapter。
Spring 框架的一个核心原则是非侵入性。这是指你不应该被迫在业务或领域模型中引入框架特定的类和接口。然而,在某些地方,Spring 框架确实给你提供了将 Spring 框架特定依赖项引入代码库的选项。提供这些选项的理由是,在某些场景中,以这种方式编写或阅读某些特定功能可能会更简单。然而,Spring 框架(几乎)总是为你提供选择的自由:你可以根据自己的特定用例或场景做出明智的决定,选择最适合的选项。
与本章相关的一个选择是选择哪个 AOP 框架(以及哪种 AOP 风格)。你可以选择 AspectJ、Spring AOP 或两者兼而有之。你还可以选择 @AspectJ 注解风格的方法或 Spring XML 配置风格的方法。本章选择首先介绍 @AspectJ 风格的方法,并不意味着 Spring 团队更偏爱 @AspectJ 注解风格而不是 Spring XML 配置风格。
有关每种风格的优缺点的更完整讨论,请参见 选择使用哪个 AOP 声明风格。