此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

方面实例化模型

这是一个高级主题。如果您刚刚开始使用 AOP,您可以放心地跳过 直到以后。

默认情况下,应用程序中每个方面都有一个实例 上下文。AspectJ 称之为单例实例化模型。可以定义 具有替代生命周期的方面。Spring 支持 AspectJ 的perthis,pertargetpertypewithin实例化模型;percflowpercflowbelow目前没有 支持。spring-doc.cadn.net.cn

您可以声明一个perthisaspect 通过指定perthis子句中的@Aspect注解。请考虑以下示例:spring-doc.cadn.net.cn

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

	private int someState;

	@Before("execution(* com.xyz..service.*.*(..))")
	public void recordServiceUsage() {
		// ...
	}
}
@Aspect("perthis(execution(* com.xyz..service.*.*(..)))")
class MyAspect {

	private val someState: Int = 0

	@Before("execution(* com.xyz..service.*.*(..))")
	fun recordServiceUsage() {
		// ...
	}
}

在前面的示例中,的perthis子句是一个方面实例 为执行业务服务的每个唯一服务对象创建 (每个唯一的 绑定到this在与切入点表达式匹配的连接点处)。方面 instance 在首次在服务对象上调用方法时创建。这 当服务对象超出范围时,方面将超出范围。方面之前 实例创建时,其中的任何通知都不会运行。一旦方面实例 ,则其中声明的通知在匹配的连接点运行,但仅 当服务对象是与此方面关联的对象时。查看 AspectJ 编程指南,了解更多信息per第。spring-doc.cadn.net.cn

pertarget实例化模型的工作方式与perthis,但它 在匹配的连接点处为每个唯一目标对象创建一个方面实例。spring-doc.cadn.net.cn