@AspectJ 支持
@AspectJ指的是一种将切面(aspects)声明为带有注解的普通Java类的方式。这种@AspectJ风格是由AspectJ项目在AspectJ 5版本中引入的。Spring也支持与AspectJ 5相同的注解,它使用AspectJ提供的库来进行切点(pointcuts)的解析和匹配。不过,AOP的运行时仍然是纯粹的Spring AOP,并且不依赖于AspectJ编译器或织入器(weaver)。
使用AspectJ编译器和编织器可以充分利用AspectJ语言的功能,相关内容在使用AspectJ与Spring应用程序中有详细介绍。
部分总结
📄️ 启用@AspectJ支持
要在Spring配置中使用@AspectJ切面,你需要启用Spring对基于@AspectJ切面的AOP配置的支持,并根据bean是否被这些切面通知(advised)来自动代理该bean。所谓自动代理,是指如果Spring判定一个bean被一个或多个切面通知,它将自动生成该bean的代理对象,以拦截方法调用,并确保在需要时运行相应的切面逻辑(advice)。
📄️ 声明一个方面(Aspect)
当启用@AspectJ支持时,Spring会自动检测应用程序上下文中所有由带有@AspectJ注解(即属于@AspectJ切面的类)定义的bean,并使用这些bean来配置Spring AOP。接下来的两个示例展示了实现一个功能不太强大的切面所需的最基本步骤。
📄️ 声明切点(Pointcut)
切点(Pointcuts)决定了我们感兴趣的连接点(join points),从而让我们能够控制建议(advice)在何时执行。Spring AOP仅支持针对Spring Bean的方法执行连接点,因此你可以将切点理解为与Spring Bean上的方法执行相匹配的规则。一个切点的声明包含两个部分:一部分是签名(signature),由名称和任何参数组成;另一部分是切点表达式(pointcut expression),用于精确指定我们感兴趣的方法执行。在AOP的@AspectJ注解样式中,切点签名是通过常规方法定义来提供的,而切点表达式则是通过使用@Pointcut注解来表示的(作为切点签名的方法必须具有void返回类型)。
📄️ 声明性建议(Declaration of Advice)
建议(Advice)与一个切点表达式(Pointcut Expression)相关联,并在由该切点匹配的方法执行之前、之后或期间运行。切点表达式可以是一个内联切点(Inline Pointcut),也可以是对一个命名切点(Named Pointcut)的引用。
📄️ 介绍
在AspectJ中,引入(introductions)机制允许横切面声明被通知对象实现某个给定的接口,并代表这些对象提供该接口的实现。
📄️ 方面实例化模型(Aspect Instantiation Models)
默认情况下,应用程序上下文中的每个方面(aspect)都只有一个实例。AspectJ将这种模式称为“单例实例化模型”(singleton instantiation model)。也可以定义具有不同生命周期的方面。Spring支持AspectJ的“perthis”、“pertarget”和“pertypewithin”实例化模型;而“percflow”和“percflowbelow”目前尚不支持。
📄️ AOP示例
现在你已经了解了所有组成部分的工作原理,我们可以将它们组合起来,用来做一些有用的事情了。