Ответ
Аннотации @Component и @Bean в Spring имеют разные цели и применяются к разным элементам кода:
@Component(и ее стереотипы@Service,@Repository) помечает класс как кандидат для автоматического обнаружения и регистрации в контексте Spring.@Beanпомечает метод внутри класса, аннотированного@Configuration, как фабрику, возвращающую объект (бин) для управления контейнером.
Почему @Component не работает для методов?
- Семантика сканирования: Механизм component-scan ищет аннотации на типах (классах), а не на методах.
- Разная логика создания: Бин, объявленный через
@Component, создается контейнером через рефлексию (конструктор). Бин, объявленный через@Bean, создается в результате вызова пользовательского метода, что дает большую гибкость.
Пример правильного использования:
// Класс-компонент
@Component
public class MyService { /* ... */ }
// Конфигурация с фабричным методом
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
// Создание бина через сложную логику
return new HikariDataSource();
}
}