java - 为什么导致@Cacheable 内部的条件没有任何影响?
问题描述
我有以下方法:
@Cacheable(value = "pow_cache", unless = "#pow==3",condition = "#val<5&&#result<100")
public Double pow(int val, int pow) throws InterruptedException {
System.out.println(String.format("REAL invocation myService.pow(%s, %s)", val, pow));
Thread.sleep(3000);
return Math.pow(val, pow);
}
以及以下主要内容:
@SpringBootApplication
@EnableCaching
public class Main {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext context = SpringApplication.run(Main.class);
MyService myService = context.getBean(MyService.class);
invokePow(myService, 4, 4);
}
private static void invokePow(MyService myService, int val, int pow) throws InterruptedException {
for (int i = 0; i < 2; i++) {
System.out.println(String.format("invoke myService.pow(%s, %s)", val, pow));
System.out.println(myService.pow(val, pow));
}
}
}
我看到以下输出:
invoke myService.pow(4, 4)
REAL invocation myService.pow(4, 4)
256.0
invoke myService.pow(4, 4)
256.0
所以这意味着结果被缓存了,但这是出乎意料的,因为
condition = "#val<5&&#result<100"
结果是 256 并且256<100
是错误的
我错了什么?
解决方案
condition
和之间有区别unless
。基于此
public abstract String 除非
Spring 表达式语言 (SpEL) 属性用于否决方法缓存。
与 condition() 不同,此表达式在方法被调用后进行评估,因此可以引用结果。默认为“”,这意味着缓存永远不会被否决。
从spring doc 3.2.x开始
,您#result
只能在unless
.
你可以试试
@Cacheable(value = "pow_cache", unless = "#pow==3||#result>100",condition = "#val<5")
推荐阅读
- tensorflow - 保存和加载 Keras 模型不起作用
- excel-formula - 如何从 Power Query 获得 vlookup 类型体验
- python - TensorFlow 对象检测 API 错误 - 访问被拒绝 [WINDOWS]
- excel - 从大型数据集中将人员分类为团队价值观
- css - 如何通过 css 从 Squarespace 中的嵌入式 zoho 形式更改字体系列?
- linux - 在 shell 脚本中计算文件中更改的行数
- python - 我的代码不起作用,我该如何解决?
- javascript - 防止通过提交事件中的 if 语句提交
- python - 从元组中删除逗号
- magento2 - M2E Cron 作业不会在 Magento 2 中自动运行