我想缓存数据,但是我对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/

10-09 04:44