Как подгрузить бин в Spring без использования аннотации @Service
Что проверяют
Понимаете ли вы, что @Service сам по себе ничего не делает: это @Component с другим именем, а бином класс делает регистрация определения в контейнере. Следом обычно просят зарегистрировать класс из чужой библиотеки, на который аннотацию не повесить.
Как отвечать
Покажите, что способов несколько и у каждого своя ниша:
- другие стереотипы:
@Component,@Repository,@Controllerнаходит то же сканирование.@Repositoryдополнительно получает трансляцию исключений вDataAccessException; @Beanв@Configuration: основной путь для сторонних классов и для бинов со сложной логикой создания;- фильтры сканирования:
@ComponentScanсincludeFiltersиFilterType.ASSIGNABLE_TYPEделает бином класс вообще без аннотаций; @Import: подключает конфигурацию или конкретный класс напрямую, без сканирования пакета;- программная регистрация:
GenericApplicationContext.registerBean(MyClass.class, MyClass::new),ImportBeanDefinitionRegistrar,BeanDefinitionRegistryPostProcessor. Нужна, когда набор бинов известен только в рантайме. В Spring Framework 7 для этого добавили интерфейсBeanRegistrar; - XML:
<bean>и@ImportResource, в основном на легаси-проектах; - автоконфигурация Spring Boot: класс с
@AutoConfiguration, указанный в файлеMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. Так устроены стартеры.
Закончите правилом выбора: свой код через стереотипы, чужой через @Bean, динамику через программную регистрацию.
Где спотыкаются
Создают объект через new и удивляются, что не работают @Autowired и @Transactional. Контейнер про такой объект не знает, прокси вокруг него не строится.
Объявляют @Bean в классе без @Configuration. Это облегчённый режим: вызов одного @Bean-метода из другого не перехватывается и создаёт новый экземпляр вместо синглтона. То же самое при proxyBeanMethods = false.
Регистрируют готовый объект через registerSingleton и ждут внедрения зависимостей. Метод кладёт экземпляр как есть, постпроцессоры к нему не применяются, так что ни инъекции, ни прокси не будет.