Spring AOP 核心概念和术语

207 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

切面 aspect

将多个类的横切关注点模块化,就得到一个切面。企业级 Java 应用中,事务管理是横切关注点的一个很好的例子。

摘自 Pro Spring 5 An aspect is the combination of advice and pointcuts encapsulated in a class. This combination results in a definition of the logic that should be included in the application and where it should execute. 切面是封装了通知和切入点的类,此两者共同定义了需要包含到应用中的逻辑以及应该在哪里执行。

Spring AOP 中,切面有两种实现方式:

  • 普通类,也就是基于模式的方式 schema-based approach
  • 带有 @Aspect 注解的普通类,也就是 @AspectJ 风格(AspectJ 是一个流行的 Java AOP 框架)

OOP 中,模块化的单位是类,而在 AOP 中,模块化的单位是切面。切面将多种类型和对象的横切关注点 crosscutting concern 进行模块化。

团子注:我也曾见过 切面 = 切点 + 通知 这样的公式,也算比较形象化了。

连接点 join point

连接点是程序执行过程中的一个时间点,比如执行一个方法,或者处理一个异常。在 Spring AOP 中,连接点总是表示方法的执行。

通知 advice

通知是由切面在某个连接点上采取的操作。包括 Spring 在内的很多 AOP 框架将通知建模成一个拦截器 interceptor,并围绕连接点维护一个拦截器链。

通知有很多种类型:

  • 前置通知 before advice:在连接点之前执行的通知,除非前置通知抛出异常,否则它无法阻断执行流程进入连接点。
  • 后置通知 after (finally) advice:不管连接点正常结束还是抛出异常,都会执行后置通知,也叫最终通知。
  • 环绕通知 around advice:环绕连接点执行的通知。它是最为强大的通知类型。
    • 它可以在方法调用之前或者之后执行自定义行为
    • 它可以选择执行连接点
    • 它可以将被通知方法短路,直接返回连接点的返回值,或者抛出一个异常。
  • 返回通知 after returning advice:连接点正常结束运行后执行的通知,比如一个方法不抛出异常,正常返回时执行返回通知。
  • 异常通知 after throwing advice:连接点抛出异常结束后执行的通知。

环绕通知是最通用的一种通知。推荐使用可以实现需求的最简单的通知类型,比如需要使用一个方法的返回值来更新缓存,那么最好使用返回通知,即使环绕通知也可以实现同样的功能。使用更为具体的通知类型会简化编程模型,从而减少出错的几率。举个例子,如果你不用在切入点上调用环绕通知的 proceed() 方法,就不可能发生调用它出错的情况。

切入点 pointcut

切入点是用来匹配连接点的一个谓词 predicate。通知与切入点表达式相关联,在匹配切入点的连接点处执行。使用切入点表达式匹配连接点的概念是 AOP 的核心,Spring 默认使用 AspectJ 的切入点表达式语言。

通过切入点匹配连接点AOP 与传统拦截技术的主要区别。切入点可以让通知独立于面向对象体系来锁定目标。比如,由环绕通知提供的声明式事务管理可以应用到跨越多个对象的一组方法上。

引入 introduction

引入可以为一个类声明额外的方法或者属性。Spring AOP 可以对任意被通知对象引入新的接口及其对应实现。比如,你可以使用引入来让一个 bean 实现 IsModified 接口,以简化缓存。在 AspectJ 社区中,引入也被称作跨类型声明 inter-type declaration

目标对象 target object

目标对象指的是被一个或多个切面通知的对象。也被称作被通知对象 advised object。因为 Spring AOP 是通过运行时代理实现的,目标对象就是一个被代理对象 proxied object

AOP 代理 AOP proxy

AOP 代理指的是由 AOP 框架创建的代理对象,用于实现切面合约,完成通知方法执行等工作。在 Spring 框架中,AOP 代理是 JDK 动态代理,或者 CGLIB 代理。

织入 weaving

织入指的是将切面链接到目标对象,创建 AOP 代理的过程。织入可以发生在编译时、加载时或者运行时。Spring AOP,正如其他的纯 Java AOP 框架一样,在运行时执行织入。

摘自 Pro Spring 5 Weaving: This is the process of inserting aspects into the application code at the appropriate point. 织入指的是向应用代码合适的地方插入切面的过程。