Какие Spring API кроме Spring Core и Spring Redis использовали на последнем проекте
Что проверяют
Насколько широко и осознанно вы работали с экосистемой Spring, а не только с @Autowired. Интервьюер ищет модули, которые вы можете обсудить в деталях, и почти всегда цепляется за один из них: «как у вас была устроена авторизация» или «как решали N+1 в Spring Data».
Как отвечать
Назовите три-четыре модуля, с которыми работали реально, и к каждому одну деталь из своего проекта. Каркас для типичного бэкенда:
- Spring Boot: автоконфигурация, стартеры,
application.ymlс профилями, Actuator для health и метрик через Micrometer; - Spring Web MVC или WebFlux:
@RestController,@ControllerAdviceдля единой обработки ошибок, валидация через@Validи Bean Validation. Если был WebFlux, объясните, зачем понадобилась реактивность; - Spring Data JPA: репозитории, derived queries,
@Query,@EntityGraphпротив N+1, пагинация черезPageable; - Spring Security:
SecurityFilterChain, OAuth2 Resource Server с проверкой JWT,@PreAuthorizeна методах; - транзакции:
@Transactional, варианты propagation, почему вызов метода изнутри того же бина не проходит через прокси; - Spring for Apache Kafka или Spring AMQP:
@KafkaListener, обработка ошибок, повторы, dead letter topic; - Spring Cloud: Config, OpenFeign, Gateway, Resilience4j через Spring Cloud CircuitBreaker, если архитектура была микросервисной.
Покажите, что следите за версиями: Spring Boot 3 требует Java 17 и перешёл на пакеты jakarta.*, а WebSecurityConfigurerAdapter из Spring Security удалён, безопасность теперь настраивается бинами. Если какой-то модуль знаете только по туториалу, так и скажите: два модуля с глубиной лучше восьми названий.
Где спотыкаются
Перечисляют модули списком без единого примера. Следующий вопрос «а как именно у вас проверялся JWT» ставит в тупик.
Путают Spring Boot и Spring Framework, называя Boot «модулем для REST». Boot отвечает за сборку и конфигурацию приложения, а REST даёт Spring Web.
Не знают, как @Transactional работает через прокси, и не могут объяснить, почему транзакция не открылась при вызове соседнего метода того же класса или на private методе.