Java 指定在Spring中创建代理的顺序
我有一个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
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我在返回切入点之后使用,因为如果抛出异常,我不想记录。