Java 为什么可以';我们不能在spring中使用@Cacheable和静态方法来处理ehcache吗?
我刚接触Spring,读到我们不能将Java 为什么可以';我们不能在spring中使用@Cacheable和静态方法来处理ehcache吗?,java,spring,caching,ehcache,Java,Spring,Caching,Ehcache,我刚接触Spring,读到我们不能将@Cacheable与静态方法一起使用,但找不到为什么我们不能使用,这样任何人都可以解释,以便初学者可以轻松理解? 我们可以使用静态方法检索数据库表吗? 我对DAO的服务层的所有方法都做了静态方法,所以这是线程安全的吗?这是用于提供缓存的机制的一个限制 当您将某个方法标记为@Cacheable时,Spring将为您的bean创建一个代理,该代理拦截方法调用并提供缓存,并将注入该方法而不是原始bean。因此,如果您有以下代码: @Inject private M
@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中的工作方式是代理对象试图像目标一样“行动”,因此它必须伪装自己,但由于静态方法没有绑定到对象,而是绑定到实际类(类只是一个蓝图,告诉您如何创建对象)代理对象不能将自己伪装成目标,因为它本身就是一个对象,它只是不能欺骗调用方告诉他它就是目标,因为调用方知道目标不是一个对象,而目标方看到代理是一个对象。啊,很好的解释