Каков жизненный цикл сервлета?
- Как Spring MVC связан с сервлетами?
Сервлет — объект, обрабатывающий HTTP-запросы в контейнере (Tomcat). Цикл: init один раз → service (doGet, doPost…) на каждый запрос в разных потоках → destroy при остановке.
- Экземпляр один на все запросы — поля сервлета не должны хранить данные запроса
- Spring MVC — это один сервлет DispatcherServlet, который раздаёт запросы контроллерам
- Spring Boot 3 — пакеты jakarta.servlet вместо javax.servlet
А ещё Фильтры (Filter) работают до сервлета — на них построен Spring Security
Подробно
Жизненный цикл:
- контейнер загружает класс и создаёт один экземпляр;
init(ServletConfig)— однократная инициализация (при старте или первом запросе —load-on-startup);service(request, response)— на каждый запрос, в потоке из пула контейнера; для HTTP — вызовdoGet,doPostи т. д.;destroy()— при остановке приложения: освободить ресурсы.
Потокобезопасность. Один экземпляр обслуживает все запросы параллельно, поэтому изменяемые поля сервлета — гонка данных. Данные запроса — в локальных переменных, атрибутах запроса или сессии. То же правило для singleton-контроллеров Spring.
Spring MVC регистрирует в контейнере один сервлет — DispatcherServlet (front controller). Он принимает все запросы, находит обработчик через HandlerMapping, вызывает его через HandlerAdapter, сериализует ответ и обрабатывает исключения.
Spring Boot запускает встроенный Tomcat (Jetty, Undertow), регистрирует DispatcherServlet и фильтры автоматически. С Spring Boot 3 / Spring 6 — Jakarta EE: пакеты jakarta.servlet.* вместо javax.servlet.*, что ломает старые библиотеки при миграции.
Что хотят услышать
- Этапы init, service, destroy.
- Один экземпляр и потокобезопасность.
- Связь с DispatcherServlet.
- jakarta.servlet в Boot 3 — плюс.
Частые ошибки
- Хранить данные запроса в поле сервлета или контроллера.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓init() один раз, затем service() на каждый запрос, destroy() при выгрузке
- ✗Новый экземпляр сервлета создаётся и инициализируется на каждый входящий запрос
- ✗init() вызывается на каждый запрос
- ✗destroy() вызывается после каждого запроса
Что спросят дальше
- Чем ServletConfig отличается от ServletContext?
- Что делает filter?
Разбор темы
- Сервлеты, фильтры и встроенный контейнер
Сервлет и встроенный Tomcat, модель thread-per-request, потокобезопасность контроллеров, Filter против Interceptor и forward/redirect.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.