IoC-контейнер

Inversion of Control означает, что создание объектов и связывание зависимостей передано внешнему механизму. В Spring этим механизмом служит BeanFactory/ApplicationContext.

Что хранит контейнер

Контейнер работает с BeanDefinition: там описаны тип, способ создания, scope, зависимости, callbacks и дополнительные признаки. Bean — уже созданный объект, definition — рецепт.

Источники definition:

  • component scanning;
  • методы @Bean;
  • auto-configuration;
  • XML;
  • программная регистрация.

Dependency Injection

@Service
class BillingService {
    private final PaymentGateway gateway;
 
    BillingService(PaymentGateway gateway) {
        this.gateway = gateway;
    }
}

Класс не ищет gateway сам. Контейнер выбирает подходящий bean по типу, qualifier, primary и другим правилам.

Что IoC не делает

  • не исправляет плохие границы модулей;
  • не делает объект stateless или потокобезопасным;
  • не гарантирует, что найден единственный кандидат;
  • не управляет объектами, созданными обычным new, если их явно не передать контейнеру.

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

  1. Что инвертируется в IoC? Управление созданием и связыванием объектов переходит от прикладного кода контейнеру.
  2. BeanDefinition и bean — одно? Нет: описание и экземпляр.
  3. DI — единственная форма IoC? Нет, но это основной механизм Spring.
  4. Почему service locator хуже constructor injection? Зависимости скрыты и класс связан с контейнером.

Связано: Spring Context, Способы внедрения зависимостей Spring, Бин отличие от Component.