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 框架的 AOP 功能通常与 Spring IoC 容器结合使用。切面通过使用普通的 bean 定义语法进行配置(尽管这允许强大的“自动代理”功能)。这是与其他 AOP 实现的关键区别。使用 Spring AOP,您无法轻松或高效地做一些事情,例如通知非常细粒度的对象(通常是领域对象)。在这种情况下,AspectJ 是最佳选择。然而,我们的经验是,Spring AOP 为企业 Java 应用程序中大多数适合 AOP 的问题提供了出色的解决方案。
Spring AOP 从不试图与 AspectJ 竞争以提供全面的 AOP 解决方案。我们相信基于代理的框架(如 Spring AOP)和功能完善的框架(如 AspectJ)都很有价值,它们是互补的,而不是竞争的。Spring 无缝地将 Spring AOP 和 IoC 与 AspectJ 集成,以在一致的基于 Spring 的应用程序架构中实现 AOP 的所有用途。这种集成不影响 Spring AOP API 或 AOP Alliance API。Spring AOP 保持向后兼容。有关 Spring AOP API 的讨论,请参见 下一章。
|
Spring 框架的核心原则之一是非侵入性。这意味着您不应该被迫将框架特定的类和接口引入您的业务或领域模型。然而,在某些地方,Spring 框架确实为您提供了将 Spring 框架特定的依赖项引入代码库的选项。提供此类选项的理由是,在某些情况下,以这种方式阅读或编写某些特定功能可能更简单。但是,Spring 框架(几乎)总是为您提供选择:您可以自由地做出明智的决定,选择最适合您特定用例或场景的选项。 与本章相关的其中一个选择是选择哪个 AOP 框架(以及哪种 AOP 风格)。您可以选择 AspectJ、Spring AOP,或两者兼而有之。您还可以选择 @AspectJ 注解风格方法或 Spring XML 配置风格方法。本章选择首先介绍 @AspectJ 风格方法,不应被视为 Spring 团队偏爱 @AspectJ 注解风格方法而非 Spring XML 配置风格方法的指示。 有关每种风格的优缺点更完整的讨论,请参见 选择使用哪种 AOP 声明风格。 |