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, если их явно не передать контейнеру.
Вопросы для повторения
- Что инвертируется в IoC? Управление созданием и связыванием объектов переходит от прикладного кода контейнеру.
- BeanDefinition и bean — одно? Нет: описание и экземпляр.
- DI — единственная форма IoC? Нет, но это основной механизм Spring.
- Почему service locator хуже constructor injection? Зависимости скрыты и класс связан с контейнером.
Связано: Spring Context, Способы внедрения зависимостей Spring, Бин отличие от Component.