切面实例化模型
| 这是一个高级主题。如果你刚开始接触 AOP,可以放心地跳过它,以后再看。 |
默认情况下,应用程序上下文中每个切面都有一个单例实例。
AspectJ 将此称为单例实例化模型。可以用替代的生命周期定义切面。
Infra 支持 AspectJ 的 perthis、pertarget 和 pertypewithin 实例化模型;
目前不支持 percflow 和 percflowbelow。
你可以通过在 @Aspect 注解中指定 perthis 子句来声明 perthis 切面。
考虑以下示例:
-
Java
@Aspect("perthis(execution(* com.xyz..service.*.*(..)))")
public class MyAspect {
private int someState;
@Before("execution(* com.xyz..service.*.*(..))")
public void recordServiceUsage() {
// ...
}
}
在前面的例子中,perthis 子句的效果是,为每个执行业务服务的唯一服务对象
(在切点表达式匹配的连接点处绑定到 this 的每个唯一对象)创建一个切面实例。
切面实例是在服务对象上第一次调用方法时创建的。
当服务对象超出范围时,切面也超出范围。
在创建切面实例之前,其中的任何通知都不会运行。
一旦创建了切面实例,其中声明的通知就会在匹配的连接点处运行,
但前提是服务对象是与此切面关联的对象。
有关 per 子句的更多信息,请参阅 AspectJ 编程指南。
pertarget 实例化模型的工作方式与 perthis 完全相同,
但它是在匹配的连接点处为每个唯一的目标对象创建一个切面实例。