Sobes.tech
Назад к вопросам
Senior
5

Вопрос 7. Есть сервис ExampleService (см. рис). Если внешний сервис вызывает подряд методы: exampleService.getCityFromCache(100000); exampleService.getCity(100000); Сколько раз будет обращение к CityDao::getCity если кэш был пустым? @Component @RequiredArgsConstructor public class ExampleService { private final CityDao dao; @Cacheable public String getCityFromCache(int index) { return dao.getCity(index); } public String getCity(int index) { return getCityFromCache(index); } }

Компании, где спрашивали
Альфа-БанкАльфа-Банк

Ответ от нейросети

sobes.tech AI

В данном примере:

@Component
@RequiredArgsConstructor
public class ExampleService {

    private final CityDao dao;

    @Cacheable
    public String getCityFromCache(int index) {
        return dao.getCity(index);
    }

    public String getCity(int index) {
        return getCityFromCache(index);
    }

}

Вызовы:

exampleService.getCityFromCache(100000);
exampleService.getCity(100000);

Если кэш был пустым, то:

  • Первый вызов getCityFromCache(100000)

    • Кэш пуст, вызывается dao.getCity(100000), результат сохраняется в кэше.
  • Второй вызов getCity(100000)

    • Внутри вызывается getCityFromCache(100000).
    • Но вызов происходит внутри того же класса, поэтому Spring AOP-прокси не сработает, и аннотация @Cacheable не применится.
    • Следовательно, dao.getCity(100000) вызовется снова.

Итого: CityDao::getCity будет вызван 2 раза.

Это связано с тем, что Spring прокси применяет кэширование только при вызове метода через прокси (внешний вызов). Внутренние вызовы методов внутри одного класса не проходят через прокси и аннотации не срабатывают.