切面例項化模型

這是一個高階主題。如果您剛開始接觸 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.