切面例項化模型

這是一個高階主題。如果你剛開始接觸 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 完全相同,但它在匹配的連線點處為每個唯一的目標物件建立一個切面例項。