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