gpt4 book ai didi

java - 指定Spring中代理的创建顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:33 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

这就是Ordered接口(interface)用于。您需要在您的 bean 上实现它。

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

关于java - 指定Spring中代理的创建顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com