我有一个Spring应用程序,我有以下骨架类
class ServiceCaller
{
public Result callService()
{
//call a remote service
}
}
由于调用远程服务是一项昂贵的操作,我在我的应用程序中添加了缓存。我使用了EhCache Spring注释@Cacheable
并将其应用于callService()
方法。一切正常,我的Result
对象被正确缓存。
后来我想在我的所有ServiceCaller
中添加一个记录器,这样我的记录器就会记录对远程服务的每个实际调用。我不想手动将logger.info()
添加到每个这样的callService
方法中,所以我决定使用Spring AOP来实现它。
我在返回到我想要记录的所有方法之后定义了一个切入点。它正在运作;但是我注意到,即使我有一个缓存命中并且我没有调用我的实际callService
方法,我的logger点切换也被调用了。我发现这是因为我的代理到ServiceCaller
bean的顺序如下:AOPPointCutProxy(EhCacheCachingProxy(ServiceCallerBean))
。我希望仅在调用我的实际callService
方法时调用我的记录器切入点,而不是在从EhCache代理返回缓存值时调用它。这意味着我实际上希望我的代理创建层次结构采用EhCacheCachingProxy(AOPPointCutProxy(ServiceCallerBean))
的形式。请注意,我的bean定义,切入点定义,缓存配置可能都在不同的随机命名的xml文件中。
那么如何强制Spring按照我想要的顺序创建代理呢?
答案 0 :(得分:1)
这就是Ordered接口的用途。你需要在你的bean上实现它。
您可以创建一个代理,以获取应该围绕您调用的所有代理注入。只有那个复合代理包围实际的bean。在调用时,它以指定的顺序调用注入的代理。