|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
切面实例化模型
| 这是一个高级主题。如果你刚刚开始学习AOP,可以放心地暂时跳过,稍后再回来看。 |
默认情况下,应用程序上下文中每个切面只有一个实例。AspectJ 将此称为单例实例化模型。也可以定义具有不同生命周期的切面。Spring 支持 AspectJ 的 perthis、pertarget 和 pertypewithin 实例化模型;目前不支持 percflow 和 percflowbelow。
你可以通过在 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 子句的作用是:每当一个唯一的业务服务对象(即在切点表达式所匹配的连接点处绑定到 this 的每个唯一对象)执行业务服务时,都会创建一个切面实例。该切面实例在首次调用该服务对象的方法时被创建。当服务对象超出作用域时,该切面也随之超出作用域。在切面实例创建之前,其中的任何通知都不会执行。一旦切面实例被创建,其中声明的通知就会在匹配的连接点上执行,但仅限于与该切面关联的服务对象。
有关 per 子句的更多信息,请参阅 AspectJ 编程指南。
pertarget 实例化模型的工作方式与 perthis 完全相同,但它会在匹配的连接点处为每个唯一的目 标对象创建一个切面实例。