4

我正在用 aspectj 构建一个 Rest 服务器。对于同步,我想使用方面。我定义了这样的切入点来捕获发生更新和删除事件的所有点:我定义了一个注释并使用该注释来捕获同步的方法:

synchronized pointcut syncJoinPoints():call (@Synchronizes * *(..));

如果切入点同步会发生什么,同步切入点是什么意思。拦截切入点的线程是由 AspectJ 插件新创建的,还是使用进入被拦截方法的线程?

感谢您的帮助。

4

1 回答 1

5

AspectJ 不会自己创建线程:编织“仅”通过注入一些额外的指令来修改代码,但它会继续在相同的上下文中运行。

切入点定义上的synchronized关键字没有任何用处。如果您想要实现的是将所有调用(或执行,这意味着修改的代码更少)同步到@Synchronizes在同一个锁上注释的方法,您需要一个环绕建议:

public aspect SynchronizingAspect {
    private static final Object lock = new Object();

    pointcut syncJointPoint(): execution(@Synchronizes * *.*(..)); // or call()

    Object around(): syncJointPoint() {
        synchronized(lock) {
            return proceed();
        }
    }
}
于 2012-12-17T16:56:11.983 回答