Почему аннотацию @Component в Spring нельзя использовать для методов?

«Почему аннотацию @Component в Spring нельзя использовать для методов?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотации @Component и @Bean в Spring имеют разные цели и применяются к разным элементам кода:

  • @Component (и ее стереотипы @Service, @Repository) помечает класс как кандидат для автоматического обнаружения и регистрации в контексте Spring.
  • @Bean помечает метод внутри класса, аннотированного @Configuration, как фабрику, возвращающую объект (бин) для управления контейнером.

Почему @Component не работает для методов?

  1. Семантика сканирования: Механизм component-scan ищет аннотации на типах (классах), а не на методах.
  2. Разная логика создания: Бин, объявленный через @Component, создается контейнером через рефлексию (конструктор). Бин, объявленный через @Bean, создается в результате вызова пользовательского метода, что дает большую гибкость.

Пример правильного использования:

// Класс-компонент
@Component
public class MyService { /* ... */ }

// Конфигурация с фабричным методом
@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        // Создание бина через сложную логику
        return new HikariDataSource();
    }
}