Зачем нужен Spring без модулей и какую проблему он решает
Что проверяют
Понимаете ли вы, что Spring это прежде всего контейнер, а Boot, Data, Security и MVC надстройки над ним. Интервьюер хочет услышать, какую проблему решает само ядро, а следом обычно спрашивает, как контейнер создаёт бины и что такое прокси.
Как отвечать
Ядро это модули spring-core, spring-beans, spring-context и spring-aop. Главная проблема, которую они решают: кто создаёт объекты и связывает их между собой.
Без контейнера класс сам делает new для своих зависимостей или берёт их через статический getInstance(). Зависимость зашита в код: подменить реализацию в тесте нельзя, порядок инициализации держится в голове, конфигурация размазана по фабрикам. Исторически Spring появился как лёгкая альтернатива EJB, где для той же задачи требовался сервер приложений.
Что даёт ядро:
- инверсия управления и DI: объект объявляет, что ему нужно, а
ApplicationContextнаходит и передаёт зависимости. Предпочтительна инъекция через конструктор, при единственном конструкторе@Autowiredне нужен; - описание бинов:
@Configurationс методами@Bean,@Componentсо сканированием пакетов, исторически XML; - жизненный цикл и области видимости: по умолчанию
singleton, естьprototype, колбэки инициализации и уничтожения; - точки расширения:
BeanPostProcessorможет обернуть бин, так появляются прокси для@Transactional,@Asyncи собственных аспектов; - окружение:
Environment, профили и@Valueотделяют конфигурацию от кода.
Хорошо закончить мыслью, что Boot поверх этого решает уже другую задачу: автоконфигурацию и сборку готового приложения.
Где спотыкаются
Отождествляют Spring со Spring Boot и начинают рассказ со стартеров и application.yml.
Говорят, что Spring нужен «для модульности» или «для скорости». Он решает управление зависимостями и конфигурацией, быстрее код от него не становится.
Не знают, что аспекты работают через прокси: вызов @Transactional-метода из этого же класса идёт мимо прокси, и транзакция не открывается.