**Dependency Injection (DI)** — это паттерн проектирования, который используется для реализации принципа [[Inversion of Control]] (IoC). DI позволяет передавать зависимости объектам извне, вместо того чтобы объекты сами создавали их. Это ослабляет связь между компонентами системы, что делает код более гибким и удобным для поддержки.
В**Java** DI часто используется через фреймворки, такие как [[../../meta/zero/00 SpringBoot|Spring]] или [[../../meta/zero/00 Quarkus|Quarkus]], где зависимости внедряются автоматически. Основные способы внедрения зависимостей включают:
- **Внедрение через конструктор**: зависимости передаются через параметры конструктора.
- **Внедрение через сеттеры**: зависимости устанавливаются через методы.
- **Внедрение через поля**: зависимости могут быть внедрены напрямую в поля класса с использованием аннотаций.
Пример внедрения через конструктор с использованием Spring:
В этом примере Spring автоматически создаёт и инжектирует объект Engine в Car, благодаря аннотации `@Autowired`. Это упрощает управление зависимостями и позволяет легче изменять их без изменения логики программы.
Главные преимущества DI:
- **Лёгкость тестирования**: можно подменять зависимости, что упрощает создание модульных тестов.
- **Масштабируемость**: система легче адаптируется к изменениям.
- **Упрощение архитектуры**: бизнес-логика отделена от процесса создания зависимостей.