Java 指定在Spring中创建代理的顺序

Java 指定在Spring中创建代理的顺序,java,spring,aop,ehcache,Java,Spring,Aop,Ehcache,我有一个Spring应用程序,其中有以下骨架类 class ServiceCaller { public Result callService() { //call a remote service } } 由于调用远程服务是一项昂贵的操作,我在应用程序中添加了缓存。我使用了EhCache-Spring注释@Cacheable,并将其应用于callService()方法。一切正常,我的结果对象得到了正确的缓存 后来我想在我所有的ServiceCaller

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

class ServiceCaller
{
    public Result callService()
    {
        //call a remote service
    }
}
由于调用远程服务是一项昂贵的操作,我在应用程序中添加了缓存。我使用了EhCache-Spring注释
@Cacheable
,并将其应用于
callService()
方法。一切正常,我的
结果
对象得到了正确的缓存

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

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

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

这就是接口的用途。您需要在bean上实现这一点


您可以创建一个代理,该代理将注入所有应该围绕您调用的代理。只有该复合代理包围了实际的bean。调用时,它按指定顺序调用注入的代理。

您使用的是哪种切入点表达式?我认为
之后的
会起作用。@Sotirios Delimanolis我在返回
切入点之后使用
,因为如果抛出异常,我不想记录。