此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
Aspect 实例化模型
这是一个高级主题。如果您刚开始使用 AOP,则可以安全地跳过 它直到以后。 |
默认情况下,应用程序中的每个方面都有一个实例
上下文。AspectJ 称其为单例实例化模型。可以定义
具有替代生命周期的 aspects。Spring 支持 AspectJ 的perthis
,pertarget
和pertypewithin
实例化模型;percflow
和percflowbelow
目前没有
支持。
您可以声明perthis
aspect 通过指定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
子句是 1 个 aspect 实例
为执行业务服务的每个唯一服务对象创建(每个唯一的
对象绑定到this
在与切入点表达式匹配的连接点处)。坡向
实例是在第一次对 Service 对象调用方法时创建的。这
当 Service 对象超出范围时,aspect 超出范围。aspect 之前
实例,则其中的任何 Advice 都不会运行。一旦 aspect 实例
已创建,则其中声明的通知将在匹配的连接点运行,但只有
当 Service 对象是与此 aspect 关联的对象时。请参阅 AspectJ
编程指南,了解更多信息per
第。
这pertarget
实例化模型的工作方式与perthis
,但它
在匹配的连接点处为每个唯一的目标对象创建一个 aspect 实例。