Sobes.tech
Senior

Ερώτηση 7. Υπάρχει μια υπηρεσία ExampleService (βλ. εικόνα). Αν μια εξωτερική υπηρεσία καλεί διαδοχικά τις μεθόδους: exampleService.getCityFromCache(100000); exampleService.getCity(100000); Πόσες φορές θα γίνει πρόσβαση στο CityDao::getCity αν η cache ήταν κενή; @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

Απάντηση από 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 прокси применяет кэширование только при вызове метода через прокси (внешний вызов). Внутренние вызовы методов внутри одного класса не проходят через прокси и аннотации не срабатывают.