digital-garden/dev/architecture/Dependency Injection.md

71 lines
3.6 KiB
Markdown
Raw Permalink Normal View History

---
aliases:
- DI
- внедрение зависимостей
tags:
- maturity/🌱
2024-10-01 08:52:43 +03:00
date: 2023-10-26
zero-link:
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
parents:
- "[[Inversion of Control]]"
2024-10-04 01:19:00 +03:00
- "[[Паттерн проектирования]]"
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 Архитектура ПО]]
2024-10-04 01:19:00 +03:00
**Родитель**:: [[Inversion of Control]], [[Паттерн проектирования]]
**Источник**::
**Автор**::
**Создана**:: [[2023-10-06]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->