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 声明样式,以更全面地讨论每种样式的优缺点。 |