@AspectJ 支持
@AspectJ 是指一种将切面声明为带有注解的常规 Java 类的风格。@AspectJ 风格是由 AspectJ 项目 作为 AspectJ 5 版本的一部分引入的。Spring 使用由 AspectJ 提供的库来解析和匹配切点,解释与 AspectJ 5 相同的注解。然而,AOP 运行时仍然是纯粹的 Spring AOP,并且不依赖于 AspectJ 编译器或织入器。
使用 AspectJ 编译器和织入器可以使用完整的 AspectJ 语言,详细内容请参阅在 Spring 应用程序中使用 AspectJ。
章节摘要
📄️ 启用 @AspectJ 支持
要在 Spring 配置中使用 @AspectJ 切面,你需要启用 Spring 对基于 @AspectJ 切面的 Spring AOP 配置的支持,并根据这些切面是否对 bean 进行增强来自动代理 bean。自动代理的意思是,如果 Spring 确定一个 bean 被一个或多个切面增强,它会自动为该 bean 生成一个代理,以拦截方法调用并确保在需要时执行通知。
📄️ 声明一个方面
启用 @AspectJ 支持后,应用程序上下文中定义的任何具有 @AspectJ 切面(带有 @Aspect 注解)的类的 bean 都会被 Spring 自动检测到,并用于配置 Spring AOP。接下来的两个示例展示了一个不太有用的切面的最小步骤。
📄️ 声明一个切入点
切入点确定感兴趣的连接点,从而使我们能够控制通知何时运行。Spring AOP 仅支持 Spring bean 的方法执行连接点,因此你可以将切入点视为匹配 Spring bean 上方法的执行。切入点声明有两个部分:一个由名称和任何参数组成的签名,以及一个确定我们感兴趣的具体方法执行的切入点表达式。在 @AspectJ 注解风格的 AOP 中,切入点签名由常规方法定义提供,切入点表达式通过使用 @Pointcut 注解来指示(作为切入点签名的方法必须具有 void 返回类型)。
📄️ 声明建议
建议与切入点表达式相关联,并在切入点匹配的方法执行之前、之后或环绕时运行。切入点表达式可以是内联切入点,也可以是对命名切入点的引用。
📄️ 介绍
引介(在 AspectJ 中称为交叉类型声明)使得一个切面能够声明被通知的对象实现某个给定的接口,并代表这些对象提供该接口的实现。
📄️ 方面实例化模型
默认情况下,在应用程序上下文中,每个方面都有一个单一实例。AspectJ 将此称为单例实例化模型。可以定义具有不同生命周期的方面。Spring 支持 AspectJ 的 perthis、pertarget 和 pertypewithin 实例化模型;目前不支持 percflow 和 percflowbelow。
📄️ 一个 AOP 示例
现在您已经了解了所有组成部分的工作原理,我们可以将它们组合在一起做一些有用的事情。