Bean и Component
Bean — любой объект, которым управляет Spring-контейнер. Component — класс, найденный component scanning благодаря стереотипной аннотации.
@Component
@Component
class ClockProvider {}Контейнер сам создаёт объект по классу. @Service, @Repository и @Controller — специализированные стереотипы поверх @Component.
@Bean
@Configuration
class ClientConfiguration {
@Bean
ApiClient apiClient(ClientProperties properties) {
return new ApiClient(properties.baseUrl());
}
}Метод @Bean удобен, когда:
- класс из сторонней библиотеки;
- создание требует нескольких шагов;
- нужен явный контроль имени и конфигурации;
- регистрация условна.
Оба способа создают bean. Разница — в источнике BeanDefinition.
Частая ловушка
В полном @Configuration вызов одного @Bean-метода из другого может быть перехвачен для возврата контейнерного singleton. В «lite mode» обычного component такой вызов является простым Java-вызовом. Надёжнее передавать зависимость параметром метода.
Вопросы для повторения
- Каждый component является bean? После обнаружения и успешного создания — да.
- Каждый bean является component? Нет, bean может прийти из
@Beanили auto-configuration. - Когда выбрать
@Bean? Для стороннего класса или явной фабричной конфигурации. - Что дают
@Serviceи@Repositoryсверх имени? Семантику слоя;@Repositoryтакже участвует в переводе исключений persistence.
Связано: Основные аннотации Spring, IoC контейнер, Основные сущности Spring Framework.