SpringAOP是用纯Java实现的。不需要一个特别的汇编过程。SpringAOP不需要控制类加载器层次结构,因此适合在servlet容器或应用服务器中使用。
SpringAOP目前只支持方法执行连接点(建议在Springbean上执行方法)。虽然可以在不破坏核心SpringAOP API的情况下添加对字段拦截的支持,但没有实现字段拦截。如果需要通知字段访问和更新连接点,请考虑AspectJ这样的语言。
SpringAOP的AOP方法不同于大多数其他AOP框架。其目标不是提供最完整的AOP实现(尽管SpringAOP相当有能力)。相反,目的是在AOP实现和SpringIoC之间提供一个紧密的集成,以帮助解决企业应用程序中常见的问题。
例如,Spring框架的AOP功能通常与SpringIoC容器一起使用。方面是通过使用普通bean定义语法来配置的(尽管这允许强大的“自动代理”功能)。这是与其他AOP实现的一个重要区别。对于SpringAOP,您无法轻松或有效地完成一些事情,比如建议非常细粒度的对象(通常是域对象)。在这种情况下,AspectJ是最好的选择。然而,我们的经验是,SpringAOP为企业级Java应用程序中的大多数问题提供了一个很好的解决方案,这些问题都适合AOP。
SpringAOP从不与AspectJ竞争,提供全面的AOP解决方案。我们认为基于代理的框架(如SpringAOP)和完整的框架(如AspectJ)都是有价值的,它们是互补的,而不是在竞争中。Spring无缝地将SpringAOP和IoC与AspectJ集成在一起,以便在一致的基于Spring的应用程序体系结构中启用AOP的所有用途。这种集成不影响SpringAOPAPI或AOP联盟API。SpringAOP仍然向后兼容。看见下一章来讨论SpringAOPAPI。
Spring框架的核心原则之一是非侵入性。这就是不应该强迫您在业务或域模型中引入特定于框架的类和接口的想法。但是,在某些地方,Spring框架确实为您提供了在代码库中引入特定于Spring框架的依赖项的选项。给出这样的选项的理由是,在某些场景中,它可能简单易懂,或者以这种方式编写特定的功能。然而,Spring框架(几乎)总是为您提供选择:您可以自由地做出明智的决定,以确定哪个选项最适合您的特定用例或场景。
与本章相关的一种选择是选择哪一种AOP框架(以及哪种AOP风格)。您可以选择AspectJ、SpringAOP,或者两者兼而有之。您还可以选择@AspectJ注释样式方法或SpringXML配置样式方法。本章选择首先介绍@AspectJ风格的方法,这一事实不应被看作是Spring团队倾向于@AspectJ注释风格的方法而不是SpringXML配置风格的指示。
看见选择使用哪种AOP声明样式为了更完整地讨论每一种风格的“原因和原因”。