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