这个问题很难在文字中清楚地描述。 很快,如果直接调用标有@Cacheable的函数, 一切如预期。但是,如果在另一个中调用此@Cacheable函数 没有@Cacheable的函数,缓存命中率不是预期的。
请看代码: http://www.devbeacon.com/d/cache1.zip
非常感谢!
答案 0 :(得分:3)
documentation is pretty explicit about that
在代理模式(默认设置)下,只拦截通过代理进入的外部方法调用。这意味着实际上,自调用目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法用@Cacheable标记,也不会在运行时导致实际的缓存 - 考虑使用aspectj模式这种情况。
您的内部方法调用完全绕过代理。 query2
也应该有@Cacheable
。如果您不想要,则需要使用AspectJ模式。