Sobes.tech
Senior

Frage 7. Es gibt einen Service ExampleService (siehe Abbildung). Wenn ein externer Service die Methoden nacheinander aufruft: exampleService.getCityFromCache(100000); exampleService.getCity(100000); Wie oft wird auf CityDao::getCity zugegriffen, wenn der Cache leer war? @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 KI

Antwort von 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 прокси применяет кэширование только при вызове метода через прокси (внешний вызов). Внутренние вызовы методов внутри одного класса не проходят через прокси и аннотации не срабатывают.