diff --git a/dev/architecture/Dependency Injection.md b/dev/architecture/Dependency Injection.md new file mode 100644 index 00000000..c6176c78 --- /dev/null +++ b/dev/architecture/Dependency Injection.md @@ -0,0 +1,70 @@ +--- +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]] +### Дополнительные материалы +- +### Дочерние заметки + diff --git a/dev/architecture/Inversion of Control.md b/dev/architecture/Inversion of Control.md new file mode 100644 index 00000000..bff9d864 --- /dev/null +++ b/dev/architecture/Inversion of Control.md @@ -0,0 +1,99 @@ +--- +aliases: + - IoC +tags: + - maturity/🌱 +date: "[[2023-10-26]]" +zero-link: + - "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]" +parents: + - "[[Архитектурная концепция]]" +linked: +--- +Inversion of Control (IoC) — это [[архитектурная концепция]], которая заключается в передаче управления зависимостями программы от самого кода к внешней системе. Обычно, если один объект зависит от другого, он сам создаёт или запрашивает его. В IoC этот процесс контролируется извне, что позволяет программам быть более гибкими и легко расширяемыми. + +Простой пример: допустим, у вас есть класс, который зависит от другого класса для выполнения своей работы. В обычном подходе класс сам создаёт объект-зависимость. + +```java +class Engine { + public void start() { + System.out.println("Engine started"); + } +} + +class Car { + private Engine engine; + + public Car() { + // Класс Car сам создает зависимость + this.engine = new Engine(); + } + + public void drive() { + engine.start(); + System.out.println("Car is moving"); + } +} + +public class Main { + public static void main(String[] args) { + Car car = new Car(); + car.drive(); + } +} +``` + +С использованием **IoC**, создание объекта Engine передаётся внешнему компоненту. Теперь Car не отвечает за создание своей зависимости: + +```java +class Engine { + public void start() { + System.out.println("Engine started"); + } +} + +class Car { + private Engine engine; + + // Зависимость передается через конструктор (IoC) + public Car(Engine engine) { + this.engine = engine; + } + + public void drive() { + engine.start(); + System.out.println("Car is moving"); + } +} + +public class Main { + public static void main(String[] args) { + // Создание зависимостей осуществляется снаружи + Engine engine = new Engine(); + Car car = new Car(engine); + car.drive(); + } +} +``` + +IoC помогает реализовать принципы [[../../../../garden/ru/dev/architecture/SOLID|SOLID]], особенно [[../../../../garden/ru/dev/architecture/Dependency Inversion Principle|Принцип инверсии зависимостей]] (Dependency Inversion Principle, DIP), согласно которому высокоуровневые модули не должны зависеть от низкоуровневых модулей напрямую. Оба типа модулей должны зависеть от абстракций. В контексте IoC это означает, что классы не должны напрямую создавать свои зависимости, а получать их через интерфейсы или внешние механизмы. Такой подход упрощает замену реализаций, тестирование и расширение приложения. + +**Преимущества IoC** +- **Ослабление связности кода**. Поскольку классы не создают свои зависимости напрямую, их связь с конкретными реализациями уменьшается. Это облегчает изменение или замену зависимостей без изменения самого класса. +- **Упрощение тестирования**. IoC позволяет легко заменять реальные зависимости на тестовые (например, mock-объекты), что упрощает процесс модульного тестирования. Вы можете изолировать классы и тестировать их независимо от реальных зависимостей. +- **Лучшая расширяемость**. Система, построенная на принципах IoC, легче адаптируется к изменениям и новым требованиям. Новые зависимости могут быть добавлены или изменены без значительного изменения существующего кода. +- **Разделение ответственности**. С IoC создаётся чёткое разделение между бизнес-логикой и управлением зависимостями. Это помогает сосредоточить внимание на основной функциональности класса, не отвлекаясь на вопросы создания объектов. +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]] +**Родитель**:: [[Архитектурная концепция]] +**Источник**:: +**Автор**:: +**Создана**:: [[2023-10-26]] +### Дополнительные материалы +- +### Дочерние заметки + + +- [[Dependency Injection]] + diff --git a/dev/architecture/Архитектурная концепция.md b/dev/architecture/Архитектурная концепция.md new file mode 100644 index 00000000..47dd91ba --- /dev/null +++ b/dev/architecture/Архитектурная концепция.md @@ -0,0 +1,23 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-01 +zero-link: + - "[[../garden/ru/meta/zero/00 Архитектура ПО|00 Архитектура ПО]]" +parents: +linked: +--- +- [[Inversion of Control]] +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-01]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + diff --git a/dev/architecture/Паттерн программирования.md b/dev/architecture/Паттерн программирования.md new file mode 100644 index 00000000..73f9e39c --- /dev/null +++ b/dev/architecture/Паттерн программирования.md @@ -0,0 +1,28 @@ +--- +aliases: + - паттерн +tags: + - maturity/🌱 +date: "[[2023-11-05]]" +zero-link: + - "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]" +parents: + - "[[Архитектурная концепция]]" +linked: +--- +- [[Dependency Injection]] + +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]] +**Родитель**:: [[Архитектурная концепция]] +**Источник**:: +**Автор**:: +**Создана**:: [[2023-11-05]] +### Дополнительные материалы +- +### Дочерние заметки + + +- [[Dependency Injection]] + diff --git a/meta/zero/00 SpringBoot.md b/meta/zero/00 SpringBoot.md index b5822e75..57d0e556 100644 --- a/meta/zero/00 SpringBoot.md +++ b/meta/zero/00 SpringBoot.md @@ -1,10 +1,11 @@ --- -aliases: +aliases: + - spring tags: - type/zero-link date: 2023-11-15 zero-link: - "[[../../../../garden/ru/meta/zero/00 Java разработка|00 Java разработка]]" -parents: [] +parents: linked: --- diff --git a/meta/zero/00 Архитектура ПО.md b/meta/zero/00 Архитектура ПО.md index 0f669490..54f8d911 100644 --- a/meta/zero/00 Архитектура ПО.md +++ b/meta/zero/00 Архитектура ПО.md @@ -5,6 +5,8 @@ zero-link: - "[[00 Разработка]]" --- - [[../../dev/architecture/Архитектурный слой|Архитектурный слой]] +- [[../../dev/architecture/Архитектурная концепция|Архитектурная концепция]] + - [[../../dev/architecture/Паттерн программирования|Паттерн программирования]] Архитектурные ошибки и проблемы: - [[../../dev/architecture/Протекание абстракций|Протекание абстракций]]