71 lines
3.6 KiB
Markdown
71 lines
3.6 KiB
Markdown
|
---
|
|||
|
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]]
|
|||
|
### Дополнительные материалы
|
|||
|
-
|
|||
|
### Дочерние заметки
|
|||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|