|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
AOP概念
让我们首先定义一些核心的AOP概念和术语。这些术语并不是Spring特有的。不幸的是,AOP的术语并不是特别直观。然而,如果Spring使用自己的术语,会更加令人困惑。
-
方面:一种跨越多个类的关注点的模块化。 事务管理是企业Java应用程序中一个良好的横切关注点示例。 在Spring AOP中,方面是通过使用普通类(基于模式的方法)或带有
@Aspect注解的普通类(@AspectJ风格)来实现的。 -
切点:程序执行过程中的一个点,例如方法的执行或异常的处理。在Spring AOP中,切点总是表示方法的执行。
-
通知:切面在特定连接点执行的操作。不同类型的通知包括“环绕”、“前置”和“后置”通知(通知类型将在后续章节讨论)。包括 Spring 在内的许多 AOP 框架将通知建模为拦截器,并在连接点周围维护拦截器链。
-
切点:一个匹配连接点的谓词。通知与切点表达式相关,并在切点匹配的任何连接点处运行(例如,具有特定名称的方法的执行)。由切点表达式匹配的连接点的概念是面向切面编程的核心,Spring 默认使用 AspectJ 切点表达式语言。
-
简介:代表一个类型声明额外的方法或字段。Spring AOP 允许您向任何建议的对象引入新的接口(以及相应的实现)。例如,您可以使用引入功能让一个 Bean 实现一个
IsModified接口,以简化缓存。(在 AspectJ 社区中,这种引入被称为交叉类型声明。) -
目标对象:被一个或多个切面通知的对象。也称为“被通知对象”(advised object)。由于Spring AOP通过运行时代理实现,该对象始终是一个代理对象。
-
AOP代理:由AOP框架创建的对象,用于实现切面契约(例如通知方法的执行等)。在Spring框架中,AOP代理可以是JDK动态代理或CGLIB代理。
-
织入:将切面与其他应用类型或对象进行链接,以创建一个受 advised 的对象。这可以在编译时(例如使用 AspectJ 编译器)、加载时或运行时完成。Spring AOP 与其他纯 Java AOP 框架一样,在运行时进行织入。
Spring AOP 包含以下类型的增强:
-
前置通知:在连接点之前执行的通知,但无法阻止执行流程继续到连接点(除非它抛出异常)。
-
在返回建议后:在连接点正常完成之后执行的建议(例如,如果方法在不抛出异常的情况下返回)。
-
在抛出通知之后:如果方法通过抛出异常退出时要运行的通知。
-
在(最终)通知之后:无论连接点通过何种方式退出(正常或异常返回),都要执行的通知。
-
围绕通知:围绕连接点(如方法调用)的通知。 这是最强大类型的通知。围绕通知可以在方法调用前后执行自定义行为。它还负责选择是否继续执行连接点,或者通过返回自己的返回值或抛出异常来缩短被通知的方法执行。
环绕通知是类型最通用的通知。由于Spring AOP,就像AspectJ一样,提供了完整范围的通知类型,我们建议您使用能够实现所需行为的最弱通知类型。例如,如果您只需要在方法返回值上更新缓存,那么与使用环绕通知相比,实现返回后通知会更合适,尽管环绕通知也可以完成相同的事情。使用最具体的通知类型可以提供一个更简单的编程模型,减少出错的可能性。例如,您不需要在用于环绕通知的proceed()上调用JoinPoint方法,因此您不会忘记调用它。
所有通知参数都是静态类型的,这样您可以使用适当类型的通知参数(例如,方法执行的返回值类型),而不是 Object 数组。
通过切点匹配的连接点概念是面向方面编程(AOP)的关键,这使其区别于仅提供拦截功能的旧技术。切点使建议可以独立于面向对象的层次结构进行定位。例如,你可以将一个提供声明式事务管理的环绕建议应用于跨越多个对象的一组方法(比如服务层中的所有业务操作)。