Spring AOP 的功能与目标
Spring AOP是用纯Java实现的。它不需要特殊的编译过程。Spring AOP不需要控制类加载器的层次结构,因此适用于在servlet容器或应用服务器中使用。
Spring AOP目前仅支持方法执行切点(即在Spring Bean的方法执行时进行拦截)。虽然不支持字段拦截功能,但实际上可以在不破坏Spring AOP核心API的前提下添加对字段拦截的支持。如果你需要拦截字段访问和更新的环节,可以考虑使用AspectJ这样的框架。
Spring AOP的实现方式与其他大多数AOP框架不同。其目标并非提供最完整的AOP实现(尽管Spring AOP本身完全有能力做到这一点),而是为了实现AOP实现与Spring IoC之间的紧密集成,以帮助解决企业应用程序中常见的问题。
因此,例如,Spring Framework的AOP功能通常与Spring IoC容器一起使用。方面(Aspects)是通过使用常规的bean定义语法来配置的(尽管这允许强大的“自动代理”功能)。这是与其他AOP实现的一个关键区别。使用Spring AOP时,你无法轻松或高效地完成某些操作,比如对非常细粒度的对象(通常是领域对象)进行通知(advise)。在这种情况下,AspectJ是最佳选择。然而,根据我们的经验,对于那些适合使用AOP的企业级Java应用程序中的大多数问题,Spring 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 Framework的核心价值观之一就是非侵入性。这一理念意味着,你不应该被迫在业务逻辑或领域模型中引入特定于框架的类和接口。然而,在某些情况下,Spring Framework确实允许你在代码库中引入与框架相关的依赖项。提供这些选项的原因是,在特定的场景下,以这种方式实现某些功能可能会更加简洁易读。不过,Spring Framework(几乎)总是会给你选择的权利:你可以根据自己的实际需求或场景,自由地决定哪种方案最适合你。
与本章内容相关的一个选择就是:应该选择哪种AOP框架(以及哪种AOP实现风格)。你可以选择AspectJ、Spring AOP,或者两者都使用。同时,你也可以选择使用@AspectJ注解方式,或者Spring XML配置方式。本章首先介绍@AspectJ风格的方式,并不意味着Spring团队更青睐这种注解方式而非XML配置方式。
有关每种方式的优缺点,请参阅选择使用哪种AOP声明风格。