|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
切面实例化模型
| 这是一个高级主题。如果你刚刚开始学习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编程指南。
The pertarget 实例化模型的工作方式与 perthis 完全相同,但它为每个匹配连接点的唯一目标对象创建一个切面实例。