切面例項化模型
| 這是一個高階主題。如果您剛開始接觸 AOP,可以暫時跳過它,以後再學。 |
預設情況下,在應用程式上下文中,每個切面只有一個例項。AspectJ 將此稱為單例例項化模型。可以定義具有備用生命週期的切面。Spring 支援 AspectJ 的 perthis、pertarget 和 pertypewithin 例項化模型;目前不支援 percflow 和 percflowbelow。
您可以透過在 @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 完全相同,但它為匹配連線點上的每個唯一目標物件建立一個切面例項。