切面实例化模型

这是一个高级主题。如果您刚开始接触 AOP,可以暂时跳过它,以后再学。

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

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

  • Java

  • Kotlin

@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 的每个唯一对象)创建一个切面实例。切面实例在首次调用服务对象上的方法时创建。当服务对象超出范围时,切面也超出范围。在切面实例创建之前,其内部的任何通知都不会运行。一旦切面实例创建,其内部声明的通知将在匹配的连接点运行,但仅当服务对象是与此切面关联的对象时。有关 per 子句的更多信息,请参阅 AspectJ 编程指南。

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

© . This site is unofficial and not affiliated with VMware.