5.4.6. 切面实例化模型

这是一个高级话题。如果您刚开始使用 AOP,您可以放心地跳过它,直到以后。

默认情况下,应用程序上下文中的每个切面都有一个实例。AspectJ 将此称为单例实例化模型。可以定义具有备用生命周期的切面。Spring AspectJ支持perthispertarget 实例化模型;percflow, percflowbelow, 和pertypewithin当前不受支持。

您可以通过在@Aspect注解中指定一个perthis子句来声明一个perthis切面。考虑以下示例:

@Aspect("perthis(com.xyz.myapp.CommonPointcuts.businessService())")
public class MyAspect {

    private int someState;

    @Before("com.xyz.myapp.CommonPointcuts.businessService()")
    public void recordServiceUsage() {
        // ...
    }
}

在前面的示例中,perthis子句的效果是为执行业务服务的每个唯一服务对象(每个唯一对象绑定到切入点表达式匹配的this连接点)创建一个切面实例。切面实例是在第一次在服务对象上调用方法时创建的。当服务对象超出范围时,切面超出范围。在创建切面实例之前,其中的任何通知都不会运行。一旦创建了切面实例,其中声明的通知就会在匹配的连接点处运行,但仅当服务对象是与此切面关联的对象时。有关per子句的更多信息,请参阅 AspectJ 编程指南。

pertarget实例化模型的工作方式与 完全相同perthis,但它在匹配的连接点为每个唯一目标对象创建一个切面实例。

最后更新于