diff --git a/dev/architecture/Циклические зависимости сервисов.md b/dev/architecture/Циклические зависимости сервисов.md new file mode 100644 index 00000000..5a44615f --- /dev/null +++ b/dev/architecture/Циклические зависимости сервисов.md @@ -0,0 +1,133 @@ +--- +aliases: +tags: + - maturity/🌱 +date: + - - 2023-11-20 +zero-link: + - "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]" +parents: +linked: +--- +Циклические зависимости между сервисами возникают, когда сервисы взаимно внедряются друг в друга. Например, сервис А внедряет сервис Б, но в тоже время сервис Б внедряет сервис А. В этом случае [SpringBoot](../../meta/zero/00%20SpringBoot.md) и [Quarkus](../../meta/zero/00%20Quarkus.md) не знают, как создать такие бины и внедрить их друг в друга. + +> [!WARNING] +> Обычно такая ситуация сигнализирует о плохо продуманной архитектуре приложения.  + +Пример циклической зависимости в Spring: + +```java +@Service +public class ServiceOne { + + private final ServiceTwo serviceTwo; + + public ServiceOne(ServiceTwo serviceTwo) { + this.serviceTwo = serviceTwo; + } + +} +``` + +```java +@Service +public class ServiceTwo { + + private final ServiceOne serviceOne; + + public ServiceTwo(ServiceOne serviceOne) { + this.serviceOne = serviceOne; + } + +} +``` + +Вот что вы можете с этим сделать: +## Пересмотреть архитектуру приложения +==Это предпочтительный вариант.== Возможно вам стоит создать сервис В, который внедрит в себя сервисы А и Б. В таком случае вы распутаете циклическую зависимость. + +```java +@Service +public class ServiceThree { + + private final ServiceOne serviceOne; + private final ServiceTwo serviceTwo; + + public ServiceThree(ServiceOne serviceOne, ServiceTwo serviceTwo) { + this.serviceOne = serviceOne; + this.serviceTwo = serviceTwo; + } + +} +``` + +```java +@Service +public class ServiceOne { + +} +``` + +```java +@Service +public class ServiceTwo { + +} +``` +## Ленивое внедрение +В Spring вы можете указать аннотацию `@Lazy` у аргумента конструктора одного их сервисов. Таким образом сначала будет создан один сервис, для второго сервиса спринг создаст прокси класс, создаст из него бин и внедрит его в ваш сервис. После чего создаст второй сервис и внедрит туда уже созданный первый. А далее заменит ссылку с прокси объекта на второй сервис. + +```java +@Service +public class ServiceTwo { + + private final ServiceOne serviceOne; + + public ServiceTwo(@Lazy ServiceOne serviceOne) { + this.serviceOne = serviceOne; + } + +} +``` + +```java +@Service +public class ServiceOne { + + private final ServiceTwo serviceTwo; + + public ServiceOne(ServiceTwo serviceTwo) { + this.serviceTwo = serviceTwo; + } + +} +``` +## Внедрение через Setter +Внедрить один из сервисов через сеттер, вместо конструктора. Таким образом, фреймворк сможет создать оба бина, а потом уже внедрит один в другой. + +```java +@Service +public class ServiceOne { + + private final ServiceTwo serviceTwo; + + public ServiceOne(ServiceTwo serviceTwo) { + this.serviceTwo = serviceTwo; + } + +} +``` + +```java +@Service +public class ServiceTwo { + + private ServiceOne serviceOne; + + @Autowired + public void setServiceOne(ServiceOne serviceOne) { + this.serviceOne = serviceOne; + } + +} +``` \ No newline at end of file diff --git a/dev/git/Откатываем git reset hard в Idea.md b/dev/git/Откатываем git reset hard в Idea.md index 7fbfc097..de986cee 100644 --- a/dev/git/Откатываем git reset hard в Idea.md +++ b/dev/git/Откатываем git reset hard в Idea.md @@ -18,6 +18,6 @@ linked: Скорее всего вы увидите состояние файла до выполнения `git reset`. -Если же измененных файлов было много, то восстанавливать их по одному довольно муторно. Поэтому нажмите ПКМ по корневой папке проекта и также выберете Local History —> Show History. +Если же измененных файлов было много, то восстанавливать их по одному довольно муторно. Поэтому нажмите ПКМ по корневой папке проекта и также выберете `Local History —> Show History`. Вот и все, впредь будьте внимательнее 😊 \ No newline at end of file diff --git a/index.md b/index.md index 64fa8ea6..e590c1bb 100644 --- a/index.md +++ b/index.md @@ -35,6 +35,9 @@ enableToc: false - [Quarkus](meta/zero/00%20Quarkus.md) - [SpringBoot](meta/zero/00%20SpringBoot.md) - [00 Hibernate](meta/zero/00%20Hibernate.md) + - Архитектура + - [Архитектура ПО](meta/zero/00%20Архитектура%20ПО.md) + - [Архитектура ИС](meta/zero/00%20Архитектура%20ИС.md) - [DevOps](meta/zero/00%20DevOps.md) - [Docker](meta/zero/00%20Docker.md) - [Snippets](meta/zero/00%20Snippets.md) diff --git a/meta/zero/00 Архитектура ИС.md b/meta/zero/00 Архитектура ИС.md new file mode 100644 index 00000000..d0a82c75 --- /dev/null +++ b/meta/zero/00 Архитектура ИС.md @@ -0,0 +1,11 @@ +--- +tags: + - type/zero-link +parents: + - "[[00 Разработка]]" +title: Архитектура ПО +--- +- [Монолитная архитектура](Монолитная%20архитектура.md) +- [Микросервисная архитектура](Микросервисная%20архитектура.md) +- [Service Oreinted Architecture](Service%20Oreinted%20Architecture.md) +- [Трёхзвенная структура](Трёхзвенная%20структура.md) \ No newline at end of file diff --git a/meta/zero/00 Архитектура ПО.md b/meta/zero/00 Архитектура ПО.md new file mode 100644 index 00000000..aad41b30 --- /dev/null +++ b/meta/zero/00 Архитектура ПО.md @@ -0,0 +1,6 @@ +--- +tags: + - type/zero-link +zero-link: + - "[[00 Разработка]]" +--- diff --git a/meta/zero/00 Разработка.md b/meta/zero/00 Разработка.md index bd491784..41e3d5c4 100644 --- a/meta/zero/00 Разработка.md +++ b/meta/zero/00 Разработка.md @@ -2,4 +2,7 @@ tags: - type/zero-link --- -- [Java разработка](00%20Java%20разработка.md) \ No newline at end of file +- [Java разработка](00%20Java%20разработка.md) +- Архитектура + - [Архитектура ПО](00%20Архитектура%20ПО.md) + - [Архитектура ИС](00%20Архитектура%20ИС.md) \ No newline at end of file