对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

Spring AOP 的功能与目标

Spring AOP 是用纯 Java 实现的。无需特殊的编译过程。Spring AOP 不需要控制类加载器层次结构,因此适用于 Servlet 容器或应用服务器。spring-doc.cadn.net.cn

Spring AOP 目前仅支持方法执行连接点(即对 Spring Bean 上方法的执行进行增强)。虽然字段拦截尚未实现,但即使将来添加对字段拦截的支持,也不会破坏 Spring AOP 的核心 API。如果您需要对字段访问和更新的连接点进行增强,请考虑使用 AspectJ 等语言。spring-doc.cadn.net.cn

Spring AOP 的 AOP 实现方式不同于大多数其他 AOP 框架。其目标并非提供最完整的 AOP 实现(尽管 Spring AOP 已经相当强大),而是旨在实现 AOP 与 Spring IoC 的紧密集成,以帮助企业应用程序解决常见问题。spring-doc.cadn.net.cn

因此,举例来说,Spring 框架的 AOP 功能通常与 Spring IoC 容器结合使用。切面通过普通的 bean 定义语法进行配置(尽管这种方式支持强大的“自动代理”功能)。这是与其他 AOP 实现的关键区别。使用 Spring AOP 时,某些事情难以轻松或高效地完成,例如对非常细粒度的对象(通常是领域对象)进行通知。在这种情况下,AspectJ 是最佳选择。然而,我们的经验表明,对于企业级 Java 应用中适合采用 AOP 解决的大多数问题,Spring AOP 提供了出色的解决方案。spring-doc.cadn.net.cn

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-doc.cadn.net.cn

Spring 框架的核心原则之一是非侵入性(non-invasiveness)。这一理念指的是,你不应被迫在自己的业务或领域模型中引入框架特定的类和接口。然而,在某些情况下,Spring 框架确实为你提供了在代码库中引入 Spring 特定依赖项的选项。之所以提供这些选项,是因为在某些场景下,以这种方式编写或阅读某些特定功能的代码可能会更加简单明了。不过,Spring 框架(几乎)始终会给你选择权:你可以自由地根据具体情况或场景,做出最适合自己的明智决策。spring-doc.cadn.net.cn

本章涉及的一个重要选择是使用哪种AOP框架(以及采用哪种AOP风格)。你可以选择AspectJ、Spring AOP,或者两者结合使用。你还可以选择使用@AspectJ注解风格的方法,或者Spring XML配置风格的方法。本章首先介绍@AspectJ风格这一事实,并不意味着Spring团队更倾向于@AspectJ注解风格而非Spring XML配置风格。spring-doc.cadn.net.cn

有关每种风格的优缺点的更完整讨论,请参见选择使用哪种AOP声明风格spring-doc.cadn.net.cn