在Spring的单个缓存中缓存两个方法的结果

问题描述 投票:1回答:1

我有两种方法,第一种返回元素列表,第二种返回单个元素:

List<User> users(List<Integer> userIds);
User user(Integer userId);

[我希望Spring缓存这两个方法的结果,以便在调用元素列表方法(users())时,它为提供的id(userIds)以及单个元素方法( user())是使用先前提供给它使用缓存的元素列表方法的ID调用的。

我可以简单地将@Cacheable应用于这些方法,然后(如果我正确理解的话)在我调用时:

users(Arrays.asList(1, 2))

结果将被缓存,但是当我打电话时

user(1);

将不使用缓存。春天如何做到这一点?

java spring spring-cache
1个回答
0
投票

您可以使用以下方法。只有第一种方法getUser(Integer id)是可缓存的,第二种方法只是合并getUser调用的结果。

@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
class UserService {

    private final UserService self;

    @Autowired
    public UserService(UserService userService) {
        self = userService;
    }

    @Cacheable(cacheNames = "users", key = "id")
    public User getUser(Integer id) {
        return new User();
    }

    public List<User> getUsers(List<Integer> ids) {
        List<User> list = new ArrayList<>();
        for (Integer id : ids) {
            list.add(self.getUser(id));
        }
        return list;
    }
}

将bean注入自己并调用的技巧

[self.getUser(id)而不是this.getUser(id)

是必需的,因为@Cacheable仅在使用Spring代理bean时才被实际调用,并且this不是代理。更多详情,请点击Transactions, Caching and AOP: understanding proxy usage in Spring

© www.soinside.com 2019 - 2024. All rights reserved.