4

我有一个 Spring 应用程序,其中有以下骨架类

class ServiceCaller
{
    public Result callService()
    {
        //call a remote service
    }
}

由于调用远程服务是一项昂贵的操作,我在我的应用程序中添加了缓存。我使用了 EhCache Spring 注释@Cacheable并将其应用于callService()方法。一切正常,我的Result对象被正确缓存。

后来我想在我的所有ServiceCallers 中添加一个记录器,这样我的记录器就会记录对远程服务的每个实际调用。我不想手动添加logger.info()到每个这样callService的方法,所以我决定使用 Spring AOP 来实现它。

在返回到我想要记录的所有方法后,我定义了一个切入点。它正在工作;callService但是我注意到,即使我有缓存命中并且我的实际方法没有被调用,我的记录器切入点也被调用了。我观察到,发生这种情况是因为我的ServiceCallerbean 代理顺序如下AOPPointCutProxy(EhCacheCachingProxy(ServiceCallerBean)):我希望只有在调用我的实际方法时才调用我的记录器切入点,callService而不是在它从 EhCache 代理返回缓存值时调用。这意味着我实际上希望我的代理创建层次结构采用EhCacheCachingProxy(AOPPointCutProxy(ServiceCallerBean)). 请注意,我的 bean 定义、切入点定义、缓存配置可能都在不同的随机命名的 xml 文件中。

那么如何强制 Spring 按我想要的顺序创建代理呢?

4

1 回答 1

2

这就是Ordered接口的用途。你需要在你的 bean 上实现它。

您可以创建一个代理,以获取应该围绕您调用的所有注入的代理。只有那个复合代理围绕着实际的 bean。在调用时,它会按照指定的顺序调用注入的代理。

于 2013-04-05T19:29:30.643 回答