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 Framework的AOP功能通常与Spring IoC容器一起使用。通过使用普通的bean定义语法来配置切面(尽管这允许强大的“自动代理”功能)。这与其他AOP实现有着重要的区别。使用Spring AOP无法轻松或高效地做一些事情,比如通知非常细粒度的对象(通常是领域对象)。在这种情况下,AspectJ是最佳选择。然而,我们的经验是,Spring AOP为AOP适用于企业Java应用程序中的大多数问题提供了出色的解决方案。

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 Framework的核心原则之一是非侵入性。这意味着您不应该被强制将特定于框架的类和接口引入到您的业务或领域模型中。然而,在某些地方,Spring Framework确实给您提供了选项,可以将Spring Framework特定的依赖项引入到您的代码库中。给予您这些选项的理由是,对于某些情况,以这种方式编写某些特定功能可能更容易阅读或编码。然而,Spring Framework(几乎)总是为您提供选择:您有自由根据特定用例或场景选择最适合的选项。

与本章相关的一个选择是选择哪种AOP框架(以及哪种AOP风格)。您可以选择AspectJ、Spring AOP或两者兼用。您还可以选择@AspectJ注解风格方法或Spring XML配置风格方法。本章选择首先介绍@AspectJ风格方法,并不意味着Spring团队更偏爱@AspectJ注解风格方法而不是Spring XML配置风格方法。

请参阅选择使用哪种AOP声明风格,以获取有关每种风格的优缺点的更全面讨论。