Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我们不能在spring中使用@Cacheable和静态方法来处理ehcache吗?_Java_Spring_Caching_Ehcache - Fatal编程技术网

Java 为什么可以';我们不能在spring中使用@Cacheable和静态方法来处理ehcache吗?

Java 为什么可以';我们不能在spring中使用@Cacheable和静态方法来处理ehcache吗?,java,spring,caching,ehcache,Java,Spring,Caching,Ehcache,我刚接触Spring,读到我们不能将@Cacheable与静态方法一起使用,但找不到为什么我们不能使用,这样任何人都可以解释,以便初学者可以轻松理解? 我们可以使用静态方法检索数据库表吗? 我对DAO的服务层的所有方法都做了静态方法,所以这是线程安全的吗?这是用于提供缓存的机制的一个限制 当您将某个方法标记为@Cacheable时,Spring将为您的bean创建一个代理,该代理拦截方法调用并提供缓存,并将注入该方法而不是原始bean。因此,如果您有以下代码: @Inject private M

我刚接触Spring,读到我们不能将
@Cacheable
静态方法一起使用,但找不到为什么我们不能使用,这样任何人都可以解释,以便初学者可以轻松理解?
我们可以使用静态方法检索数据库表吗?

我对DAO的
服务层
的所有方法都做了
静态方法
,所以这是
线程安全的吗?

这是用于提供缓存的机制的一个限制

当您将某个方法标记为
@Cacheable
时,Spring将为您的bean创建一个代理,该代理拦截方法调用并提供缓存,并将注入该方法而不是原始bean。因此,如果您有以下代码:

@Inject
private MyBean myBean;
...
myBean.myMethod("foo");
如果
MyBean
已声明
myMethod()
@Cacheable
,则
MyBean
将不会指向您在应用程序上下文中放置的内容,而是指向一个代理,该代理将进行缓存并仅在缓存查找未返回任何内容时调用原始的
MyBean.myMethod()

Proxys无法拦截静态方法,因此代理无法缓存静态方法。这就是为什么
@Cacheable
在静态方法上不起作用的原因。

详细阐述我的评论:

“无法缓存静态方法。Aspect在Spring中的工作方式是向带注释的类添加包装类(代理)。在Java中无法向静态方法添加包装。”

因为Spring需要一个对象进行包装,以便拦截对该对象的调用,并在将修改后的输入委托给原始对象之前执行各种操作(因此Spring方面是可能的)


由于任何
静态的
都不能被实例化为对象,Spring无法围绕它并拦截它的调用(至少在Spring当前的实现中)

您可能会从链接中找到答案:“静态方法不能被缓存。Aspect在Spring中的工作方式是添加一个包装类(一个代理)添加到注释类。在Java中无法向静态方法添加包装。“@CeilingGecko我已经浏览了该网站,但我无法理解,因此您能否详细说明“Aspect在Spring中的工作方式是向注释类添加包装类(一个代理)。在Java中无法向静态方法添加包装。”?我会在一本Spring书中找到一个很好的图形,然后写下一个答案,如果有人没有抢先一步:P@CellingGecko,非常感谢,但是仍然有一个问题出现了,为什么spring不能在包装类中调用静态方法(可能是由于
静态方法不能被重写
?)@KamleshKanazariya在Spring中的工作方式是代理对象试图像目标一样“行动”,因此它必须伪装自己,但由于静态方法没有绑定到对象,而是绑定到实际类(类只是一个蓝图,告诉您如何创建对象)代理对象不能将自己伪装成目标,因为它本身就是一个对象,它只是不能欺骗调用方告诉他它就是目标,因为调用方知道目标不是一个对象,而目标方看到代理是一个对象。啊,很好的解释