如何获取有关 Spring Boot 应用程序中使用哪个缓存管理器的信息?

问题描述 投票:0回答:2

在 Spring Boot 应用程序中,即使我完全放弃声明特定的缓存管理器,使用

@Cacheable
注释也可以工作并提供缓存条目。所以我假设,至少有一些简单的 HashMap 缓存系统在工作。

现在,我如何确保预期的缓存系统(例如

Caffeine
Ehcache
)正确就位并满足我的请求,而不是便宜的包含在内?由于缓存系统通过代理拦截调用,我完全不知道为此设置断点。

有什么方法可以查看当前哪个缓存管理器正在工作吗?

spring-boot ehcache
2个回答
0
投票

是的,默认的缓存机制是一些HashMap,在ConcurrentMapCacheManager中实现。我想验证您是否获得您期望的 CacheManager 的最直接方法是这样的。

创建一个服务并将 CachManager 注入其中,然后创建一个 PostConstruct 方法来检查它是否是您想要的服务。

@Service
public class CacheVerifier {
  private final CacheManager cacheManager;

  public CacheVerifier(CacheManager cacheManager) {
    this.cacheManager = cacheManager;
  }

  @PostConstruct
  public void verify() {
    assert this.cacheManager instanceof CaffeineCacheManager;
  }
}

0
投票

通过参考文档

Springboot 提供了关于缓存的很好的文档。请参阅第 1 节缓存

如果您不添加任何特定的缓存库,Spring Boot 会自动配置一个在内存中使用并发映射的简单提供程序。

要找出正在使用的缓存管理器应用程序,我们可以在缓存上使用actuator api。 假设执行器已设置并且缓存端点已公开。 当我们转到

http://localhost:8080/actuator/caches
时,你会看到如下所示的内容:

{
  "cacheManagers": {
    "cacheManager": {
      "caches": {
        "nameCache": {
          "target": "java.util.concurrent.ConcurrentHashMap"
        }
      }
    }
  }
}

通过深入研究代码

由于缓存系统通过代理拦截调用,我完全不知道为此设置断点。

使用断点是一种更通用的方法,但通常更困难。我将认为这是最后尝试的方法。 (没主意的时候不妨尝试一下,通过代码追踪一定会有收获)

以下是我将执行的步骤

  • @Cacheable
    方法中放置断点,
  • 它将在第一次调用时命中,然后查看调用堆栈,
  • 从spring中查找缓存相关的类/包
  • 尝试理解流程,在你感兴趣的地方放置断点,然后重新运行程序
© www.soinside.com 2019 - 2024. All rights reserved.