Подготовка по Spring
IoC, бины, транзакции, Spring MVC, Spring Boot и Spring Security — вопросы с разбором.
- 01Spring оборачивает бины в прокси, чтобы работали @Transactional и @Cacheable. Какие практические следствия из этого вытекают?
Прокси перехватывает только внешние вызовы: this.method() внутри класса идёт мимо прокси — аннотация не сработает. CGLIB не проксирует final-классы и final-методы, JDK-прокси…
Middle - 02Как соотносятся IoC и DI в Spring?
IoC (инверсия управления) — принцип: объекты не создают свои зависимости и не управляют своим жизненным циклом, это делает контейнер. DI (внедрение зависимостей) — конкретный…
Junior - 03Какая аннотация объединяет @Controller и @ResponseBody, чтобы методы возвращали данные прямо в тело ответа?
@RestController = @Controller + @ResponseBody: возвращаемое значение каждого метода сериализуется в тело ответа (обычно JSON через Jackson), а не трактуется как имя представления.
Junior - 04Какие преимущества у constructor injection по сравнению с field injection? Выберите все верные.
Внедрение через конструктор даёт final-поля, полностью готовый объект сразу после создания, явные зависимости и тесты без Spring — достаточно вызвать конструктор.
Junior - 05Что такое Spring Bean?
Бин — объект, которым управляет контейнер Spring: создаёт, внедряет зависимости, инициализирует, оборачивает прокси и уничтожает при закрытии контекста.
Junior - 06Как работает @Transactional и почему вызов метода внутри того же класса (self-invocation) может не открыть транзакцию?
@Transactional реализован прокси: вызов снаружи идёт через прокси, который открывает транзакцию и вызывает метод. Вызов this.other() внутри класса идёт мимо прокси — аннотация на…
Middle - 07Какой scope у Spring-бина по умолчанию?
По умолчанию singleton — один экземпляр на контейнер, общий для всех потоков. Ещё: prototype (новый на каждый запрос к контейнеру), веб-scope request, session, application…
Junior - 08Чем @Component отличается от @Bean?
@Component — на своём классе, бин находится сканированием. @Bean — на методе в @Configuration-классе, который создаёт и настраивает объект; подходит для чужих классов и сложной…
Middle - 09При каком исключении @Transactional по умолчанию откатывает транзакцию?
По умолчанию откат — на RuntimeException и Error. На checked-исключения транзакция коммитится. Меняется через rollbackFor и noRollbackFor.
Middle - 10Как разрешить неоднозначность, когда для внедрения подходят несколько бинов одного типа?
При нескольких кандидатах — NoUniqueBeanDefinitionException. Решения: @Primary — бин по умолчанию; @Qualifier("имя") — выбрать конкретный в точке внедрения (он сильнее @Primary).
Middle - 11Что такое AOP в Spring и его ключевые понятия?
AOP выносит сквозную функциональность (транзакции, безопасность, логирование, метрики) из бизнес-кода в аспекты. Advice — что и когда выполнить; pointcut — где; join point …
Middle - 12Как в Spring Boot 3 возвращать ошибки REST API в едином формате?
@RestControllerAdvice с @ExceptionHandler централизует обработку, а ответ — ProblemDetail (стандарт RFC 9457, application/problem+json): type, title, status, detail, instance и…
Middle - 13Чем HTTP GET отличается от POST?
GET — получить ресурс: безопасный (не меняет состояние) и идемпотентный, параметры в URL, ответ кэшируется. POST — отправить данные на обработку или создать ресурс: не…
Junior - 14Чем cookie отличается от server-side session?
Cookie — небольшие данные, которые хранит браузер и отправляет с каждым запросом к домену. Серверная сессия — данные на сервере, а в cookie лежит только её идентификатор…
Junior - 15Чем ответы 401, 403 и 404 отличаются и что возвращать на запрос чужого ресурса?
401 Unauthorized — личность не установлена: нет токена или он неверный. 403 Forbidden — личность известна, но прав нет. 404 Not Found — ресурс не найден.
Junior - 16Каков жизненный цикл сервлета?
Сервлет — объект, обрабатывающий HTTP-запросы в контейнере (Tomcat). Цикл: init один раз → service (doGet, doPost…) на каждый запрос в разных потоках → destroy при остановке.
Middle - 17Что такое Post/Redirect/Get и как сделать его в Spring MVC?
PRG: после успешного POST сервер отвечает редиректом на GET-страницу результата. Обновление страницы повторит безопасный GET, а не POST — заказ не создастся дважды.
Middle - 18Чем Spring MVC отличается от Spring WebFlux?
Spring MVC — сервлетная модель «поток на запрос», блокирующий код. WebFlux — неблокирующая модель на event loop (Netty) с Reactor: малое число потоков обслуживает много…
Senior - 19Чем ApplicationContext отличается от BeanFactory?
BeanFactory — базовый контейнер: создаёт бины и внедряет зависимости, лениво. ApplicationContext — надстройка, которой пользуются почти всегда: события, интернационализация…
Middle - 20Что такое BeanPostProcessor и зачем он нужен?
BeanPostProcessor вызывается для каждого бина до и после инициализации и может изменить или заменить объект — так появляются прокси для @Transactional, @Async, AOP и…
Middle - 21Как внедрить сразу все реализации интерфейса и выбирать нужную в рантайме?
Внедрить List<T> или Map<String, T>: Spring передаст все бины типа. Список — в порядке @Order, карта — с именами бинов в ключах. Нужная стратегия выбирается в рантайме.
Middle - 22Чем Servlet Filter отличается от HandlerInterceptor?
Filter — уровень сервлетного контейнера: работает до DispatcherServlet и видит любой запрос, включая статику и ошибки. HandlerInterceptor — внутри Spring MVC, знает обработчик…
Middle - 23Как в Spring MVC обычно обрабатывают ошибки и валидацию входных DTO?
Ограничения — аннотациями Bean Validation на полях DTO (@NotBlank, @Email, @Size, @Positive), проверка — @Valid на параметре контроллера, ошибки — в @RestControllerAdvice в едином…
Middle - 24Что такое Spring Batch и из каких основных частей состоит batch job?
Spring Batch — фреймворк для пакетной обработки больших объёмов: Job состоит из Step, шаг обычно chunk-ориентированный — ItemReader → ItemProcessor → ItemWriter пачками с коммитом…
Senior - 25Когда полезен Spring Integration?
Spring Integration — реализация Enterprise Integration Patterns: сообщения проходят через каналы и конечные точки (маршрутизаторы, преобразователи, фильтры, разделители…
Senior - 26Чем REST отличается от SOAP?
REST — архитектурный стиль поверх HTTP: ресурсы, методы, обычно JSON, кэширование, простота. SOAP — протокол обмена XML-сообщениями со строгим контрактом WSDL, стандартами…
Middle - 27Какие основные backend-риски у GraphQL?
Клиент сам составляет запрос, поэтому риски на бэкенде: N+1 в резолверах, дорогие и глубокие запросы (DoS одним запросом), сложное кэширование (всё через POST на один URL)…
Senior - 28Добавь эндпоинт GET /users/{id}, возвращающий User по идентификатору.
@RestController с @GetMapping("/users/{id}") и @PathVariable; сервис возвращает Optional → 200 с DTO или 404; наружу отдавать DTO, а не сущность JPA.
Junior - 29Что делает propagation=REQUIRES_NEW и какой подводный камень с пулом соединений он несёт?
REQUIRES_NEW приостанавливает текущую транзакцию и открывает новую независимую — со своим соединением. На это время поток держит два соединения: при большом параллелизме пул…
Senior - 30Как корректно получать prototype-бин внутри singleton-бина, чтобы каждый раз создавался новый экземпляр?
Singleton создаётся один раз, и prototype внедряется в него один раз — «застывает». Новый экземпляр при каждом использовании дают ObjectProvider<T>.getObject(), @Lookup-метод или…
Senior - 31В каком порядке контейнер выполняет шаги инициализации бина?
Порядок: конструктор → внедрение полей и сеттеров → Aware-колбэки → BPP before → @PostConstruct → afterPropertiesSet → initMethod → BPP after (здесь появляются прокси).
Middle - 32Бин объявлен со scope prototype и содержит @PreDestroy. Когда контейнер вызовет этот метод?
Никогда: контейнер создаёт prototype-бин, отдаёт и забывает о нём — destroy-колбэки не вызываются. Освобождение ресурсов — забота вызывающего кода.
Middle - 33Почему внедрение через конструктор предпочтительнее внедрения в поле?
Конструктор даёт final-поля, тестируемость без контейнера и честный сигнал о раздутых зависимостях; поле прячет зависимости и позволяет создать объект в неполном состоянии.
Middle - 34Интерфейс PaymentGateway реализуют два бина: один помечен @Primary, другой имеет имя sbpGateway. В точке внедрения стоит @Qualifier("sbpGateway"). Какой бин будет внедрён?
@Qualifier в точке внедрения сильнее @Primary: явное указание перекрывает умолчание. Будет внедрён sbpGateway.
Middle - 35Чем @Repository отличается от @Component помимо семантики?
@Repository включает трансляцию исключений: SQLException и исключения JPA превращаются в единую иерархию DataAccessException (DuplicateKeyException…
Middle - 36Что на самом деле задаёт аннотация @Order на бине?
@Order задаёт порядок бинов при внедрении списком и в цепочках (фильтры, аспекты, обработчики событий), но не порядок создания — для этого @DependsOn или явная зависимость.
Middle - 37Что верно про события приложения и @EventListener в Spring?
События ApplicationEventPublisher по умолчанию обрабатываются синхронно, в том же потоке и той же транзакции: исключение слушателя откатит публикатора. Асинхронность — явно через…
Middle - 38Что произойдёт при создании ресурса через POST, если контроллер возвращает ResponseEntity со статусом 201?
201 Created сопровождают заголовком Location с адресом созданного ресурса; тело — созданный ресурс или пусто. Spring сам Location не проставляет.
Middle - 39Чем @Validated отличается от @Valid?
@Valid — стандарт Jakarta Bean Validation, включает каскадную проверку вложенных объектов. @Validated — аннотация Spring: группы валидации и проверка параметров методов бинов (на…
Middle - 40В контроллере стоит @Valid @RequestBody CreateUserRequest, и клиент прислал невалидное тело. Что произойдёт по умолчанию?
Spring бросает MethodArgumentNotValidException, метод контроллера не вызывается, ответ по умолчанию — 400. Список ошибок полей нужно отдать клиенту через @RestControllerAdvice.
Middle - 41Чем @ControllerAdvice отличается от @ExceptionHandler внутри контроллера?
@ExceptionHandler в контроллере — локальный, в @ControllerAdvice — глобальный. Локальный обработчик подходящего типа выигрывает у глобального.
Middle - 42Разработчик добавил в @RestController поле private User currentUser и заполняет его в начале каждого метода. Что не так?
Контроллер — singleton, запросы обслуживаются параллельно в разных потоках. Поле currentUser общее: один пользователь увидит данные другого — гонка и утечка.
Middle - 43Чем forward отличается от redirect?
Forward — внутренняя передача запроса другому обработчику в том же запросе: URL в браузере не меняется, атрибуты запроса сохраняются. Redirect — ответ 302/303 с Location: браузер…
Middle - 44Какие виды advice существуют в Spring AOP?
@Before — до метода, @AfterReturning — после успешного возврата, @AfterThrowing — после исключения, @After — в любом случае (как finally), @Around — вокруг, с вызовом proceed().
Middle - 45Какие ограничения есть у Spring AOP из-за того, что он основан на прокси?
Spring AOP на прокси перехватывает только внешние вызовы публичных методов бинов: не работает self-invocation, private-методы, final-методы и классы при CGLIB, объекты не из…
Middle - 46Когда Spring создаёт JDK dynamic proxy, а когда CGLIB-прокси?
JDK dynamic proxy — реализует интерфейсы бина, перехватывает только методы интерфейсов. CGLIB — подкласс бина, работает без интерфейсов. Spring Boot по умолчанию включает CGLIB…
Middle - 47Что реально делает @Transactional(readOnly = true)?
readOnly = true — оптимизация чтения: Hibernate не делает снимков и flush (FlushMode.MANUAL), драйверу передаётся подсказка setReadOnly(true), можно направить на реплику. Это не…
Middle - 48Какие флаги cookie и зачем используют для сессионного идентификатора?
HttpOnly — недоступна из JavaScript (кража при XSS), Secure — только по HTTPS (перехват), SameSite (Lax/Strict) — не уходит с межсайтовыми запросами (CSRF). Флага Encrypted не…
Middle - 49Как устроена chunk-ориентированная обработка в Spring Batch и что она даёт?
Chunk — порция: прочитать N записей по одной, обработать, записать пачкой в одной транзакции. Память ограничена размером чанка, а после сбоя задание продолжается с последнего…
Middle - 50Что такое ApplicationContext в Spring?
ApplicationContext — контейнер бинов: создаёт их, внедряет зависимости, управляет жизненным циклом и даёт инфраструктуру — события, свойства, профили, ресурсы.
Junior - 51Что делает аннотация @Autowired?
@Autowired — точка внедрения: контейнер находит бин по типу и подставляет. Несколько кандидатов — уточняют @Primary, @Qualifier или имя.
Junior - 52Сколько экземпляров бина со scope singleton создаст контейнер?
Один экземпляр на контекст — не на всю JVM, как классический паттерн. Два контекста — два экземпляра; можно создать объект класса и вручную через new.
Junior - 53Что означает код ответа 404?
404 Not Found — ресурса по этому адресу нет. Это группа 4xx — ошибка на стороне клиента; 5xx — ошибка сервера.
Junior - 54Зачем нужна аннотация @Valid на теле запроса в контроллере?
@Valid на теле запроса включает проверку ограничений на полях DTO (@NotBlank, @Email, @Size); при нарушении метод контроллера не вызывается, клиент получает 400.
Junior - 55Что делает DispatcherServlet в Spring MVC?
DispatcherServlet — единая точка входа (front controller): принимает запрос, через HandlerMapping находит метод контроллера, вызывает его через HandlerAdapter, превращает…
Junior - 56Какую задачу решает AOP?
AOP выносит сквозную функциональность — транзакции, логирование, безопасность, метрики, кэширование — из бизнес-методов в аспекты. Метод содержит только бизнес-логику.
Junior - 57Что происходит при выходе из метода с @Transactional, если исключений не было?
Успешный выход из метода — коммит (если метод начал транзакцию). Исключение по умолчанию откатывает только неконтролируемые (RuntimeException, Error); checked — коммит.
Junior - 58Почему HTTP называют протоколом без состояния (stateless)?
Каждый запрос HTTP независим: сервер не помнит предыдущие. Чтобы связать запросы одного пользователя, нужен явный механизм — cookie с идентификатором сессии или токен.
Junior - 59Из каких частей состоит JWT?
Три части через точку: header (алгоритм), payload (claims: sub, exp, роли), signature. Каждая — base64url. Payload не зашифрован — его может прочитать любой.
Junior - 60Чем неблокирующая модель обработки отличается от модели «поток на запрос»?
«Поток на запрос»: пока запрос ждёт базу или сеть, его поток простаивает. Неблокирующая модель: мало потоков на много соединений — ожидание не держит поток, он берёт другую работу.
Junior - 61Почему у каждого вызова внешнего сервиса должен быть таймаут?
Без ограничения ожидание держит поток и соединение бесконечно: зависшая зависимость занимает все потоки, и ваш сервис перестаёт отвечать — чужая медлительность становится вашим…
Junior - 62Чем unit-тест отличается от интеграционного?
Unit-тест проверяет изолированную логику без внешних зависимостей (моки), быстро. Интеграционный — что компоненты правильно связаны между собой и с реальными системами: база…
Junior - 63Для чего предназначен Spring Batch?
Пакетная обработка больших объёмов: импорт и выгрузка файлов, перерасчёты, рассылки — чтение, преобразование и запись порциями с сохранением прогресса и перезапуском с места сбоя.
Junior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.