我有两种方法,第一种返回元素列表,第二种返回单个元素:
List<User> users(List<Integer> userIds);
User user(Integer userId);
[我希望Spring缓存这两个方法的结果,以便在调用元素列表方法(users()
)时,它为提供的id(userIds
)以及单个元素方法( user()
)是使用先前提供给它使用缓存的元素列表方法的ID调用的。
我可以简单地将@Cacheable
应用于这些方法,然后(如果我正确理解的话)在我调用时:
users(Arrays.asList(1, 2))
结果将被缓存,但是当我打电话时
user(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")
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