跳到主要内容

Aspect 实例化模型

ChatGPT-4o 中英对照 Aspect Instantiation Models

备注

这是一个高级主题。如果你刚开始学习 AOP,可以放心地跳过它,等以后再来学习。

默认情况下,在应用程序上下文中每个切面的实例都是唯一的。AspectJ 将此称为单例实例化模型。可以定义具有不同生命周期的切面。Spring 支持 AspectJ 的 perthispertargetpertypewithin 实例化模型;percflowpercflowbelow 当前不支持。

您可以通过在 @Aspect 注解中指定一个 perthis 子句来声明一个 perthis 切面。请参考以下示例:

@Aspect("perthis(execution(* com.xyz..service.*.*(..)))")
public class MyAspect {

private int someState;

@Before("execution(* com.xyz..service.*.*(..))")
public void recordServiceUsage() {
// ...
}
}
java

在前面的示例中,perthis 子句的效果是为每个执行业务服务的唯一服务对象创建一个方面实例(每个在连接点处由切入点表达式匹配并绑定到 this 的唯一对象)。方面实例是在首次调用服务对象的方法时创建的。当服务对象超出作用域时,方面也随之超出作用域。在方面实例创建之前,其中的任何通知都不会运行。一旦方面实例被创建,其中声明的通知将在匹配的连接点运行,但仅当服务对象是与此方面关联的对象时。有关 per 子句的更多信息,请参阅 AspectJ 编程指南。

pertarget 实例化模型的工作方式与 perthis 完全相同,但它在匹配的连接点为每个唯一的目标对象创建一个方面实例。