Кэшировать результаты двух методов в одном кеше в Spring - PullRequest
2 голосов
/ 08 ноября 2019

У меня есть два метода: первый возвращает список элементов, а второй возвращает один элемент:

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

Я бы хотел, чтобы Spring кэшировал результаты этих двух методов, чтобы при создании спискавызывается метод элементов (getUsersFromExternalSystem()), он кэширует результаты для предоставленных идентификаторов (userIds), а когда вызывается метод одного элемента (getUserFromExternalSystem()) с идентификатором, ранее предоставленным методу списка элементов, он используеткеш.

Я могу просто применить @Cacheable к этим методам, тогда (если я правильно понимаю), когда я вызываю:

getUsersFromExternalSystem(Arrays.asList(1, 2))

результаты будут кэшироваться, но когда я вызываю

getUserFromExternalSystem(1);

кеш не будет использоваться. Как это сделать весной?

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете использовать следующий подход. Кэшируется только первый метод 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 будет фактически вызываться только при использовании в bean-компоненте Spring, а this не является прокси. Подробнее здесь Транзакции, Кэширование и AOP: понимание использования прокси в Spring

...