我想缓存数据,但是我对spring-boot项目中@Cacheable
注释的位置感到有些困惑。
@Override
public Map<String, String> getSampleMethod1() {
Map<String, String> map = getSampleMethod2();
return map;
}
@Override
@Cacheable
public Map<String, String> getSampleMethod2() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Map<String, String> map1 = getSampleMethod3();
return map1;
}
private Map<String, String> getSampleMethod3(){
Map<String, String> map2 = new HashMap<>();
map2.put("name1", "value1");
map2.put("name2", "value2");
map2.put("name3", "value3");
return map2;
}
上面的代码无法缓存数据。我从控制器调用
getSampleMethod1()
,并且每次在控制器上单击API时getSampleMethod2()
都在运行。谁能帮我理解缓存中代理对象的概念?
最佳答案
仅从外部类对getSampleMethod2()
的调用将被拦截(实际上是通过代理进行的调用)。因此,在您的情况下,当您从同一类进行调用时,方法调用将不会被拦截,因此@Cacheable
将不起作用。
如果希望它起作用,则需要创建您的类的自动装配对象并在该对象上调用方法。
class MyService{
@Autowired
private ApplicationContext applicationContext;
MyService self;
@PostConstruct
private void init() {
self = applicationContext.getBean(MyService.class);
}
public Map<String, String> getSampleMethod1() {
Map<String, String> map = self.getSampleMethod2();
return map;
}
}
关于java - 在服务实现中放置@Cacheable批注的理想位置是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57865457/