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