--- aliases: - DI - внедрение зависимостей tags: - maturity/🌱 date: 2023-10-26 zero-link: - "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]" parents: - "[[Inversion of Control]]" - "[[Паттерн проектирования]]" linked: --- **Dependency Injection (DI)** — это паттерн проектирования, который используется для реализации принципа [[Inversion of Control]] (IoC). DI позволяет передавать зависимости объектам извне, вместо того чтобы объекты сами создавали их. Это ослабляет связь между компонентами системы, что делает код более гибким и удобным для поддержки. В **Java** DI часто используется через фреймворки, такие как [[../../meta/zero/00 SpringBoot|Spring]] или [[../../meta/zero/00 Quarkus|Quarkus]], где зависимости внедряются автоматически. Основные способы внедрения зависимостей включают: - **Внедрение через конструктор**: зависимости передаются через параметры конструктора. - **Внедрение через сеттеры**: зависимости устанавливаются через методы. - **Внедрение через поля**: зависимости могут быть внедрены напрямую в поля класса с использованием аннотаций. Пример внедрения через конструктор с использованием Spring: ```java import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; @Component class Engine { public void start() { System.out.println("Engine started"); } } @Component class Car { private final Engine engine; @Autowired public Car(Engine engine) { this.engine = engine; } public void drive() { engine.start(); System.out.println("Car is moving"); } } ``` В этом примере Spring автоматически создаёт и инжектирует объект Engine в Car, благодаря аннотации `@Autowired`. Это упрощает управление зависимостями и позволяет легче изменять их без изменения логики программы. Главные преимущества DI: - **Лёгкость тестирования**: можно подменять зависимости, что упрощает создание модульных тестов. - **Масштабируемость**: система легче адаптируется к изменениям. - **Упрощение архитектуры**: бизнес-логика отделена от процесса создания зависимостей. *** ## Мета информация **Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]] **Родитель**:: [[Inversion of Control]], [[Паттерн проектирования]] **Источник**:: **Автор**:: **Создана**:: [[2023-10-06]] ### Дополнительные материалы - ### Дочерние заметки