官方文档
A Guide To Caching in Spring | Baeldung
1、业务场景:通过类型返回不同类型集合的统一实体类,
在缓存方法时以type为key返回不同业务list
代码示例如下:
测试queryAllList2方法,理论上应该只打印一次进入查询
实际结果:
2、方法意图说明
想要实现外层
直接调用queryAllList1返回colortype是1对应的数据
直接调用queryAllList2返回colortype是2对应的数据
经测试,发现缓存失效,调用同方法queryAllList(1),始终会进行打印。
3、通过源码解惑:
springcache是通过拦截器代理方式 实现的缓存机制,当同类方法调用时 不需要代理机制 所以导致缓存失效。
①cgilb动态代理 拦截器方法
②调用方法已注册的cache拦截器
③拦截器切面方法执行 构建缓存查询缓存等
④调用对应cacheManager方法 判断key是否存在 不存在则创建
⑤在当前name的map下查找对应key的内容
⑥如果未命中 则被拦截器拦截的原方法重新获取。
So 同类里不会触发拦截器,缓存自然就失效了。
看到网上的方法通过注入自己 可以间接实现同类级别调用。(⊙o⊙)哦性能有待验证,此写法应该不算太规范。建议上层接口自己控制传参好一点?
继续努力 upup↖(^ω^)↗虽然还只是入门水平哈哈哈 见笑了
本文参照官方使用方式:同方法不同类型做二层map的key进行存储 方便好用~
4、扩展:
通过注解 依赖spring框架拦截器实现功能,同类级别尽量避免相互调用。防止注解失效。
比如经伙伴提醒:事务....