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