切面实例化模型

这是一个高级主题。如果您刚开始学习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完全相同,但它为每个匹配连接点的唯一目标对象创建一个切面实例。