Aspect 實例化模型

這是一個進階主題。如果您剛開始接觸 AOP,您可以安全地跳過它,稍後再看。

預設情況下,在應用程式上下文中,每個 aspect 只有一個實例。AspectJ 將其稱為單例實例化模型。可以定義具有替代生命週期的 aspect。Spring 支援 AspectJ 的 perthispertargetpertypewithin 實例化模型;目前不支援 percflowpercflowbelow

您可以透過在 @Aspect 註解中指定 perthis 子句來宣告 perthis aspect。請參考以下範例

  • 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 子句的效果是,對於每個執行業務服務的唯一服務物件(在 pointcut 運算式匹配的連接點上綁定到 this 的每個唯一物件),都會建立一個 aspect 實例。aspect 實例在第一次在服務物件上調用方法時建立。當服務物件超出作用域時,aspect 也會超出作用域。在建立 aspect 實例之前,其中的任何 advice 都不會執行。一旦建立 aspect 實例,其中宣告的 advice 就會在匹配的連接點執行,但僅當服務物件是與此 aspect 關聯的物件時才會執行。有關 per 子句的更多資訊,請參閱 AspectJ Programming Guide。

pertarget 實例化模型的工作方式與 perthis 完全相同,但它會為每個匹配連接點上的唯一目標物件建立一個 aspect 實例。