Spring 如何检测@Cacheable方法输出是否来自缓存?

Spring 如何检测@Cacheable方法输出是否来自缓存?,spring,ehcache,spring-annotations,spring-cache,Spring,Ehcache,Spring Annotations,Spring Cache,有一个用@Cacheable注释的方法返回一个对象: @服务 公共类用户服务{ @可缓存(“用户数据”) 公共用户数据getUserData(字符串用户名){ UserData UserData=新的UserData(); userData.setGotFromCache(false); 返回用户数据; } } 和UserData对象: @Getter @塞特 公共类用户数据{ 私有布尔缓存; } 如何检测是否调用了带注释的@Cacheable方法,或者其输出是否来自缓存 解决方法是注入Ca

有一个用@Cacheable注释的方法返回一个对象:

@服务
公共类用户服务{
@可缓存(“用户数据”)
公共用户数据getUserData(字符串用户名){
UserData UserData=新的UserData();
userData.setGotFromCache(false);
返回用户数据;
}
}
和UserData对象:

@Getter
@塞特
公共类用户数据{
私有布尔缓存;
}
如何检测是否调用了带注释的@Cacheable方法,或者其输出是否来自缓存

解决方法是注入CacheManager并手动检测:

Cache Cache=this.cacheManager.getCache(“用户数据”);
UserData UserData=null;
字符串userName=“某个用户名”;
if(缓存!=null){
对象键=SimpleKeyGenerator.generateKey(用户名);
userData=cache.get(key,userData.class);
if(userData!=null){
userData.setGotFromCache(true);
}否则{
userData=userService.getUserData(用户名);
cache.put(key,userData);
}
}否则{
userData=userService.getUserData(用户名);
}
然而,为了简单起见,这段代码没有使用@Cacheable注释


是否可以使用@Cacheable并检测输出是否来自缓存?

取决于需要检测的时间-在运行时部署应用程序时,或在开发过程中

无论哪种方式,基本思想都是一样的:必须有一个底层数据源,例如数据库(UserRepository?)或API调用或其他

在运行时,您可以通过日志记录或跟踪(例如使用Zipkin)检查是否调用了数据源

--或--


在开发过程中,您可以为模拟数据源的
UserService
编写单元测试,并验证是否与模拟对象存在“零交互”,这表明数据实际上是从缓存中获取的。

您可以更改userdata,查看返回的值是旧值还是新值