在 Spring Boot 应用程序中,即使我完全放弃声明特定的缓存管理器,使用
@Cacheable
注释也可以工作并提供缓存条目。所以我假设,至少有一些简单的 HashMap 缓存系统在工作。
现在,我如何确保预期的缓存系统(例如
Caffeine
或Ehcache
)正确就位并满足我的请求,而不是便宜的包含在内?由于缓存系统通过代理拦截调用,我完全不知道为此设置断点。
有什么方法可以查看当前哪个缓存管理器正在工作吗?
是的,默认的缓存机制是一些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;
}
}
Springboot 提供了关于缓存的很好的文档。请参阅第 1 节缓存
如果您不添加任何特定的缓存库,Spring Boot 会自动配置一个在内存中使用并发映射的简单提供程序。
要找出正在使用的缓存管理器应用程序,我们可以在缓存上使用actuator api。 假设执行器已设置并且缓存端点已公开。 当我们转到
http://localhost:8080/actuator/caches
时,你会看到如下所示的内容:
{
"cacheManagers": {
"cacheManager": {
"caches": {
"nameCache": {
"target": "java.util.concurrent.ConcurrentHashMap"
}
}
}
}
}
由于缓存系统通过代理拦截调用,我完全不知道为此设置断点。
使用断点是一种更通用的方法,但通常更困难。我将认为这是最后尝试的方法。 (没主意的时候不妨尝试一下,通过代码追踪一定会有收获)
以下是我将执行的步骤
@Cacheable
方法中放置断点,