Как соотносятся IoC и DI в Spring?
- Что такое инверсия управления?
- Что такое внедрение зависимостей?
IoC (инверсия управления) — принцип: объекты не создают свои зависимости и не управляют своим жизненным циклом, это делает контейнер. DI (внедрение зависимостей) — конкретный способ IoC: зависимости передаются объекту извне — через конструктор, сеттер или поле.
- В Spring контейнер — ApplicationContext, управляемые объекты — бины
- Код зависит от интерфейсов, конкретные реализации подставляет контейнер
- Плюсы: слабая связанность, подмена реализаций в тестах, единая настройка
А ещё Другие формы IoC: шаблонный метод, колбэки, события
Подробно
Без IoC класс сам создаёт зависимости: new JdbcOrderRepository(new HikariDataSource(...)). Он знает о конкретных классах, их конфигурации и порядке создания; подменить базу в тесте сложно.
Инверсия управления — отдать эту ответственность внешнему коду: фреймворк создаёт объекты, связывает их и вызывает ваш код в нужный момент («не звоните нам, мы позвоним вам»).
Внедрение зависимостей — способ реализации: класс объявляет, что ему нужно (параметры конструктора), а контейнер передаёт готовые объекты.
@Service
class OrderService {
private final OrderRepository repo;
OrderService(OrderRepository repo) { this.repo = repo; } // зависимость передана извне
}
Что даёт: класс зависит от абстракции, а не от реализации; в тесте передаётся заглушка без запуска контекста; конфигурация (какая реализация, какие параметры) собрана в одном месте; контейнер управляет жизненным циклом — singleton, закрытие ресурсов.
Способы внедрения: конструктор (рекомендуемый), сеттер (для необязательных зависимостей), поле (@Autowired на поле — удобно, но плохо для тестов и неизменяемости).
Что хотят услышать
- Различие: IoC — принцип, DI — способ.
- Пример класса до и после.
- Что даёт: связанность, тесты, конфигурация.
- Способы внедрения.
Частые ошибки
- Считать IoC и DI синонимами без объяснения.
- Называть Spring единственным способом делать DI.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗IoC — частный случай DI: контейнер лишь внедряет зависимости через конструктор
- ✗Это полные синонимы
- ✓DI — форма IoC: зависимости внедряет контейнер, а объект их не создаёт
- ✗IoC относится к работе с базой данных, а DI — к организации web-слоя
Что спросят дальше
- Почему constructor injection лучше field injection?
- Что такое scope бина?
Разбор темы
- IoC и Dependency Injection
Принцип инверсии управления, DI как его форма, три способа внедрения и почему конструктор, разрешение циклических зависимостей.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.