【问题标题】:SpringBoot Cache, Call @Cacheable Method from @Cacheput Method not WorkSpringBoot缓存,从@Cacheput方法调用@Cacheable方法不起作用
【发布时间】:2020-04-13 22:08:33
【问题描述】:

如果我直接致电@Cacheable (findById),它运行良好。但是如果我从@Cacheput 方法调用,那就不行了。

    @Cacheable(key = "#p0")
    public User findById(String userId) {
        User user = userRepository.findById(userId).orElseThrow(() -> new NotFoundException());
        return user;
    }
    @CachePut(key = "#p0")
    public User disabled(String userId) {
        User user = findById(userId);
        user.setStatus(0);
        userRepository.save(user);
        return user;
    }

【问题讨论】:

    标签: java spring caching


    【解决方案1】:

    “不起作用”有点抽象,所以我假设您的意思是“缓存不起作用并且每次都调用该方法”。

    这正是两者的区别:

    • @Cacheable:方法只会被调用一次,结果会被放入缓存中。
    • @CachePut:缓存会更新,但是每次都会调用该方法!

    来自文档:

    与@Cacheable 注解相比,这个(@CachePut)注解不会导致建议的方法被跳过。相反,它总是会导致调用该方法并将其结果存储在关联的缓存中。请注意,Java8 的 Optional 返回类型是自动处理的,如果存在,它的内容会存储在缓存中。

    发件人:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/CachePut.html

    如果你在内部调用另一个方法(你从 @Cacheput 调用 @Cachable),注解将不起作用,因为 Spring 中的注解通常只有在你公开调用该方法时才起作用(如,从在你的课外)。从同一个类中调用方法不会让 Spring 框架有机会进入您的代码之间并做到这一点。

    【讨论】:

    • 是的,cacheput 每次都会被调用。在我上面的代码中,在方法禁用(缓存输入)中,我调用 findById(可缓存)。在这种情况下,我希望每次调用禁用方法时都不会执行 findById 主体。
    • 为该问题添加了底部部分:添加到问题中,如果您在内部调用另一个方法(您从 @Cacheput 调用 @Cachable),注释将不起作用,因为 Spring 中的注释通常只当您公开调用该方法时工作(如在课堂外)。从同一个类中调用一个方法不会让 Spring 框架有机会进入你的代码并做到这一点。
    猜你喜欢
    • 2020-12-29
    • 2015-03-28
    • 2019-12-09
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多