为什么我们不能在 spring 的静态方法中使用 @Cacheable 和 ehcache?
Why can't we use @Cacheable with static method in spring with ehcache?
我是 Spring 的新手,读到我们不能将 @Cacheable
与 static method
一起使用,但找不到为什么我们不能使用所以任何人都可以解释初学者容易理解吗?
我们可以使用静态方法来检索 database table
吗?
我已经 static method
了 DAO service layer
的所有方法 所以这是 thread-safe
?
这是用于提供缓存的机制的限制。
当您将某些方法标记为 @Cacheable
时,Spring 会为您的 bean 创建一个代理来拦截方法调用并提供缓存,并将注入它而不是原始 bean。所以如果你有这样的代码:
@Inject
private MyBean myBean;
...
myBean.myMethod("foo");
其中 MyBean
已将 myMethod()
声明为 @Cacheable
,那么 myBean
将不会指向您在应用程序上下文中放置的内容,而是指向将执行的代理缓存并仅在缓存查找没有 return 任何内容时调用原始 MyBean.myMethod()
。
代理无法拦截静态方法,因此代理无法缓存静态方法。这就是为什么 @Cacheable
不适用于静态方法。
详细说明我的评论:
"Static methods cannot be cached. The way aspects work in Spring is by adding a wrapper class (a proxy) to the annotated class. There is no way in Java to add a wrapper to a static method."
因为 Spring 需要一个对象环绕以便拦截对该对象的调用并在将修改后的输入委托给原始对象之前执行各种操作(因此 spring 方面是可能的)。
因为任何 static
都不能被实例化为一个对象,Spring 没有办法绕过它并拦截它的调用(至少在 Spring 的当前实现中是这样) )
我是 Spring 的新手,读到我们不能将 @Cacheable
与 static method
一起使用,但找不到为什么我们不能使用所以任何人都可以解释初学者容易理解吗?
我们可以使用静态方法来检索 database table
吗?
我已经 static method
了 DAO service layer
的所有方法 所以这是 thread-safe
?
这是用于提供缓存的机制的限制。
当您将某些方法标记为 @Cacheable
时,Spring 会为您的 bean 创建一个代理来拦截方法调用并提供缓存,并将注入它而不是原始 bean。所以如果你有这样的代码:
@Inject
private MyBean myBean;
...
myBean.myMethod("foo");
其中 MyBean
已将 myMethod()
声明为 @Cacheable
,那么 myBean
将不会指向您在应用程序上下文中放置的内容,而是指向将执行的代理缓存并仅在缓存查找没有 return 任何内容时调用原始 MyBean.myMethod()
。
代理无法拦截静态方法,因此代理无法缓存静态方法。这就是为什么 @Cacheable
不适用于静态方法。
详细说明我的评论:
"Static methods cannot be cached. The way aspects work in Spring is by adding a wrapper class (a proxy) to the annotated class. There is no way in Java to add a wrapper to a static method."
因为 Spring 需要一个对象环绕以便拦截对该对象的调用并在将修改后的输入委托给原始对象之前执行各种操作(因此 spring 方面是可能的)。
因为任何 static
都不能被实例化为一个对象,Spring 没有办法绕过它并拦截它的调用(至少在 Spring 的当前实现中是这样) )