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 声明风格