我刚开始接触Spring,读到了不能在静态方法
中使用@Cacheable
,但是不知道原因。请问有人能够解释一下,让初学者更容易理解吗?
我们可以使用静态方法来检索数据库表
吗?
我已经将所有DAO服务层
的方法都改成了静态方法
,那么这样做是线程安全
的吗?
我刚开始接触Spring,读到了不能在静态方法
中使用@Cacheable
,但是不知道原因。请问有人能够解释一下,让初学者更容易理解吗?
我们可以使用静态方法来检索数据库表
吗?
我已经将所有DAO服务层
的方法都改成了静态方法
,那么这样做是线程安全
的吗?
就我的评论进行详述:
"静态方法无法被缓存。 Spring中方面的工作方式是通过向注释类添加包装器类(代理)来实现的。在Java中,没有办法对静态方法添加包装器。"
由于Spring需要一个对象来包装以拦截对该对象的调用并在将修改后的输入委托给原始对象之前执行各种操作(从而使Spring方面成为可能)。
由于任何static
内容都无法实例化为对象,因此Spring无法包装它并拦截其调用(至少在当前的Spring实现中不行)。
这是提供缓存的机制所存在的限制。
当您将某些方法标记为@Cacheable
时,Spring将创建一个代理来拦截方法调用并提供缓存,并将注入该代理而不是原始bean。因此,如果您有以下代码:
@Inject
private MyBean myBean;
...
myBean.myMethod("foo");
如果MyBean
声明了myMethod()
为@Cacheable
,那么myBean
将不会指向您在应用程序上下文中放置的内容,而是指向一个代理,该代理将执行缓存并仅在缓存查找未返回任何内容时调用原始的MyBean.myMethod()
。
代理无法拦截静态方法,因此代理无法缓存静态方法。这就是为什么@Cacheable
在静态方法上不起作用的原因。