我是Spring新手并且读到我们不能将@Cacheable
与static method
一起使用,但无法找到为什么我们无法使用,所以任何人都可以解释,以便初学者可以轻松理解?
我们可以使用静态方法来检索database table
吗?
我已经对static method
DAO的所有方法进行了service layer
所以这是thread-safe
吗?
答案 0 :(得分:11)
阐述我的评论:
"无法缓存静态方法。方面在Spring中的工作方式是通过向带注释的类添加包装类(代理)。 Java中没有办法将包装器添加到静态方法中。"
由于Spring需要一个对象来包围,以便在将修改后的输入委托给原始对象之前拦截对该对象的调用并执行各种操作(因此可以使用spring方面)。
由于static
的任何内容都无法实例化为对象,因此Spring无法绕过它并拦截其调用(至少使用Spring的当前实现)
答案 1 :(得分:2)
这是用于提供缓存的机制的限制。
当您将某个方法标记为@Cacheable
时,Spring会为您的bean创建一个代理,该拦截拦截方法调用并提供缓存,并将注入而不是原始bean。所以如果你有一些代码:
@Inject
private MyBean myBean;
...
myBean.myMethod("foo");
MyBean
已将myMethod()
声明为@Cacheable
,那么myBean
将不会指向您在应用程序上下文中放置的内容,而是指向将执行缓存的代理仅当缓存查找不返回任何内容时才调用原始MyBean.myMethod()
。
Proxys无法拦截静态方法,因此代理无法缓存静态方法。这就是为什么@Cacheable
不能用于静态方法的原因。