[英]Spring caching works only sometimes
我有一个Spring控制器,想缓存响应。 当我将@Cacheable
注释从getBooks
移到doGetBooks
方法时,缓存将停止。 一旦将其移回getBooks
方法,缓存将再次起作用。 为什么会这样,我该如何解决?
这将缓存公共方法响应
@GetMapping
@Cacheable(value = "cache", key = "{ #root.methodName }")
public Books getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) throws Exception {
if(valid) {
return this.doGetBooks();
}
throw new Exception();
}
public Books doGetBooks() throws Exception{
...
这将永远不会缓存私有方法响应
@GetMapping
public Books getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) throws Exception {
if(valid) {
return this.getBooks();
}
throw new Exception();
}
@Cacheable(value = "cache", key = "{ #root.methodName }")
public Books doGetBooks() throws Exception{
...
问题:您在同一类中调用doGetBooks(),并且Spring缓存需要AOP代理到被调用的方法。
这是一个很好的讨论,描述了Spring AOP为什么不能拦截其他类方法调用的方法 :方法中的AOP调用方法
至少有三种解决方法:
一旦调用了Spring Cache可以拦截(通过AOP)的方法,那么@Cacheable()批注就应该触发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.