Что делать после написания класса с аннотацией @Configuration в Spring
Что проверяют
Понимаете ли, что класс с аннотацией сам по себе ничего не делает, пока контекст его не увидел. И знаете ли, чем @Configuration отличается от простого набора фабричных методов.
Как отвечать
- Сделать так, чтобы контейнер нашёл класс: он должен попасть под сканирование пакетов (в Spring Boot это пакет главного класса и вложенные), либо подключаться через
@Import, либо объявляться автоконфигурацией в файле импортов. - Объявить бины методами с
@Bean. Имя бина по умолчанию совпадает с именем метода, и оно потом участвует в разрешении зависимости по имени. - Зависимости принимать параметрами метода, а не тянуть полем: контейнер подставит их сам, и связи будут видны в сигнатуре.
- Решить вопрос с
proxyBeanMethods. По умолчанию класс проксируется, поэтому вызов одного@Beanметода из другого возвращает тот же синглтон. С отключённым проксированием такой вызов создаст второй экземпляр мимо контейнера. - Развести окружения:
@Profileи условные аннотации, чтобы конфигурация не подменяла чужой бин молча. - Настройки вынести в
@ConfigurationPropertiesвместо россыпи@Valueпо методам. - Закрыть тестом: поднять срез контекста и убедиться, что бин создан, ровно один и именно ожидаемого типа.
Где спотыкаются
Кладут класс вне сканируемого пакета и потом ищут ошибку в коде бина. Бина просто нет, а падает всё в другом месте, где его пытались внедрить.
Зовут @Bean метод напрямую как обычный метод и удивляются двум экземплярам. Это работает только через прокси и только при включённом проксировании.
Внедряют зависимости в поля через @Autowired. Такой класс не собрать без контейнера, поле нельзя сделать неизменяемым, а циклическая зависимость прячется до запуска. Внедрение через конструктор снимает все три проблемы сразу.