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-вызовом. Надёжнее передавать зависимость параметром метода.

Вопросы для повторения

  1. Каждый component является bean? После обнаружения и успешного создания — да.
  2. Каждый bean является component? Нет, bean может прийти из @Bean или auto-configuration.
  3. Когда выбрать @Bean? Для стороннего класса или явной фабричной конфигурации.
  4. Что дают @Service и @Repository сверх имени? Семантику слоя; @Repository также участвует в переводе исключений persistence.

Связано: Основные аннотации Spring, IoC контейнер, Основные сущности Spring Framework.