有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

我希望Spring缓存这两个方法的结果,这样当调用元素列表方法(getUsersFromExternalSystem())时,它会缓存所提供id(userIds)的结果,当使用先前提供给元素列表方法的id调用单元素方法(getUserFromExternalSystem())时,它会使用缓存

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

getUsersFromExternalSystem(Arrays.asList(1, 2))

结果将被缓存,但当我调用

getUserFromExternalSystem(1);

缓存将不被使用。春天怎么做


共 (1) 个答案

  1. # 1 楼答案

    您可以使用以下方法。只有第一个方法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