|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
AOP概念
让我们先定义一些核心的AOP概念和术语。这些术语不是 Spring限定。遗憾的是,AOP的术语并不直观。 然而,如果Spring用自己的术语,那就更让人困惑了。
-
方面:跨越多个类别的关注点模块化。 事务管理是企业Java中跨领域关注的一个很好的例子 应用。在 Spring AOP 中,切面通过使用普通类实现 (基于模式的方法)或用
@Aspect注释(@AspectJ风格)。 -
连接点:程序执行过程中的一个点,例如执行 方法或异常处理。在春季AOP中,连接点总是固定 表示方法的执行。
-
建议:某方面在特定连接点采取的行动。不同类型的 建议包括“周围”、“之前”和“之后”。(讨论了建议类型 稍后。)许多AOP框架,包括Spring,都将建议建模为拦截者, 在连接点周围保持一连串拦截器。
-
Pointcut:匹配连接点的谓词。建议与pointcut 表达式关联,运行于与 pointcut 匹配的任意连接点(例如,执行某个名称的方法)。连接点与通过 pointcut 表达式匹配的概念是 AOP 的核心,Spring 默认使用 AspectJ 点切割表达式语言。
-
引言:代表类型声明额外的方法或字段。 Spring AOP 允许你为任何建议对象引入新的接口(以及相应的实现)。例如,你可以用引言让一个 bean 实现一个
IsModified(变体)接口,以简化缓存。(在 AspectJ 社区中,介绍称为类型间声明。) -
目标对象:由一个或多个方面建议的对象。也称为“建议对象”。由于 Spring AOP 通过运行时代理实现,这个对象始终是一个代理对象。
-
AOP 代理:由 AOP 框架创建的对象,用于实现合同(建议方法执行等)。在 Spring 框架中,AOP 代理是 JDK 动态代理或 CGLIB 代理。
-
织入:将切面与其他应用类型或对象关联,以创建推荐对象。这可以在编译时完成(例如使用 AspectJ 编译器,加载时,或运行时完成。Spring AOP 和其他纯 Java AOP 框架一样,在运行时执行编织。
春季AOP包括以下类型的建议:
-
Before advice:在连接点之前运行但不具备阻止执行流进入连接点的能力(除非抛出例外)。
-
返回建议后:建议在连接点完成后运行通常(例如,如果方法返回时未抛出异常)。
-
抛出建议后:如果方法通过抛出 例外。
-
(最终)建议之后:建议无论通过何种方式运行连接点退出(正常或例外返回)。
-
Around advice:围绕连接点的建议,如方法调用。这是最强大的建议类型。Around advice 可以执行自定义行为在方法调用之前和之后。它还负责选择是继续前往连接点,还是通过返回自己的返回值或抛出异常来捷径执行建议的方法。
Around advice 是最通用的建议类型。由于 Spring AOP,像 AspectJ 一样,提供了完整的建议类型,我们建议你使用功能最弱的建议类型,能够实现所需的行为。例如,如果你只需要用方法的返回值更新缓存,你最好实现在返回建议之后,而不是 round advice,尽管 around advice 可以实现同样的事情。使用最具体的建议类型能提供更简单的编程模型错误的可能性更低。例如,你不需要调用继续()方法JoinPoint用于提供建议,因此你不能不使用它。
所有建议参数都是静态类型,因此你可以使用建议参数相应类型(例如方法执行返回值的类型),而不是 比对象阵 列。
通过点切割匹配的连接点概念是AOP的关键,它区别于它与仅提供拦截的旧技术。点切割使建议能够独立于面向对象层级而被定位。例如,你可以将关于提供声明式事务管理的建议应用于跨越多个对象(例如服务层中的所有业务作)。