为什么我们不能在春天使用带有ehcache的静态方法使用@Cacheable?

时间:2015-01-16 07:26:12

标签: java spring caching ehcache

我是Spring新手并且读到我们不能将@Cacheablestatic method一起使用,但无法找到为什么我们无法使用,所以任何人都可以解释,以便初学者可以轻松理解? 我们可以使用静态方法来检索database table吗? 我已经对static method DAO的所有方法进行了service layer所以这是thread-safe吗?

2 个答案:

答案 0 :(得分:11)

Spring Aspect Concept

阐述我的评论:

"无法缓存静态方法。方面在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不能用于静态方法的原因。