Sobes.tech
Senior

Сұрақ 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

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 кэштеу прокси арқылы шақырылғанда ғана жұмыс істейтінін көрсетеді (сыртқы шақыру). Бір кластағы ішкі шақырулар прокси арқылы өтпейді, және аннотациялар іске қосылмайды.