对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-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 与 AspectJ 无缝集成,以在一致的基于 Spring 的应用程序架构中启用所有 AOP 的使用。此集成不会影响 Spring AOP API 或 AOP Alliance API。Spring AOP 保持向后兼容。有关 Spring AOP API 的讨论,请参阅 下一章spring-doc.cadn.net.cn

Spring框架的核心理念之一就是非侵入性。这个理念是指你不应该被迫将框架特定的类和接口引入到你的业务或领域模型中。然而,在某些地方,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