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

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

List<User> getUsersFromExternalSystem(List<Integer> userIds);
User getUserFromExternalSystem(Integer userId);

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

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

getUsersFromExternalSystem(Arrays.asList(1,2))

结果将被缓存,但是当我致电

getUserFromExternalSystem(1);

将不使用缓存。春天该怎么办?

eduasksz 回答:在Spring的单个缓存中缓存两种方法的结果

您可以使用以下方法。只有第一种方法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") // assuming that you've already initialized Cache named "users"
    public User getUser(Integer id) {
        return new User(); // ... or call to some DataSource
    }

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

将豆子注入自己并调用

的技巧

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

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

本文链接:https://www.f2er.com/3139244.html

大家都在问