Ответ
@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 {
// бизнес-логика
}