В чем разница между аннотациями @Bean и @Component в Spring? Когда что использовать?

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

Ответ

@Bean и @Component — это способы объявления Spring-бинов, но они используются в разных контекстах и имеют разные возможности.

Критерий @Bean @Component (и стереотипные аннотации: @Service, @Repository)
Объявление На методе в классе, помеченном @Configuration. На классе.
Контроль над исходным кодом Подходит для регистрации бинов из сторонних библиотек, классы которых вы не можете аннотировать. Подходит только для классов, находящихся под вашим контролем.
Гибкость создания Позволяет использовать произвольную логику в методе для создания и настройки бина. Создание экземпляра управляется Spring (через рефлексию), кастомизация сложнее.
Условное создание Легко комбинируется с @Conditional* аннотациями на уровне метода. Условная логика на уровне класса менее гибка.
Именование Имя бина — это имя метода (можно переопределить через name). Имя бина генерируется по имени класса (например, myService).

Когда использовать @Bean:

  • Для регистрации бинов из сторонних библиотек (DataSource, RestTemplate, etc.).
  • Когда требуется сложная логика инициализации.
  • Для условного создания бина в зависимости от конфигурации.

Когда использовать @Component / @Service / @Repository:

  • Для ваших собственных классов, являющихся частью бизнес-логики приложения.

Пример:

@Configuration
public class AppConfig {
    // @Bean: Создание и тонкая настройка бина из внешней библиотеки
    @Bean
    @ConditionalOnProperty(name = "cache.enabled", havingValue = "true")
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("users", "orders");
    }
}

@Service // @Component: Простое объявление вашего сервиса
public class UserService {
    // бизнес-логика
}