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