Domänengesteuerte Entwicklung mit Java und Spring Boot-Layer und Modulabteilung

Über domänengetriebene Entwicklung

Wie der Name schon sagt, ist die domänengesteuerte Entwicklung nicht nur ein Implementierungsmuster, sondern eine Entwicklungsmethode, an der andere Mitglieder als das Entwicklungspersonal beteiligt sind.

Warum in 3 Schichten teilen

Beim Entwurf einer domänengesteuerten Entwicklung wird die Software in den folgenden drei Schichten entworfen.

--Anwendungsschicht

Warum machst du so eine Trennung? Plötzlich kann die Entwicklung der mobilen App-Version beginnen, und plötzlich ist die Datenbank möglicherweise keine RDB mehr. In einem solchen Fall kann das Domänenwissen zwischen Software derselben Domäne wiederverwendet werden, und dies schließt die Domänenschicht ein.

** Anwendungsschicht **

--Hauptfunktion

** Domain-Schicht **

** Infrastrukturschicht **

--Repository

Sie können sehen, dass die Implementierungsklasse des Repositorys die Infrastrukturschicht ist. Aber warum ist die Schnittstelle eine Domänenschicht? Dies liegt daran, dass die Implementierung der Domänenschicht, die sie aufruft, unweigerlich von der Infrastrukturschicht abhängt, wenn eine Schnittstelle eine Infrastrukturschicht ist. Mit anderen Worten, Sie können die zu verwendende Infrastrukturbibliothek nicht auswählen.

Stärken des Frühlings DI

Er erklärte, dass die Schnittstelle des Repositorys in die Domänenschicht gestellt wird, damit die Domänenschicht nicht von der Infrastrukturschicht abhängt. Wo initialisieren Sie eine Instanz des Repositorys, die Implementierungswissen enthält? Einfach ausgedrückt scheint es keine andere Wahl zu geben, als es auf der Anwendungsebene zu initialisieren und an den Domänendienst weiterzugeben. Wenn Sie jedoch Spring DI verwenden und eine Implementierungsklasse als Komponente deklarieren, die die Domänendienstklasse und die Schnittstelle erbt, löst Spring DI dieses Problem. Es ist nicht erforderlich, ein Factory-Muster oder "ApplicationContextAware" vorzubereiten.

@Repository
public class Repository extends IRepository {
  ...
}

Verwenden Sie den Konstruktor "@ Autowired" anstelle des Feldes "@ Autowired", um die Abhängigkeit aufzulösen. Es erleichtert das Schreiben von Unit-Tests. Es kann einfacher mit Lomboks "@ RequiredArgsConstructor" geschrieben werden.

@Service
@RequiredArgsConstructor
public class Service {
  private final IRepository repository;
}
IRepository mockRespository = new MockRepository();
var service = new Service(mockRespotory);

Modulteilung

Ich schrieb, dass die Software in drei Schichten entworfen wurde, aber sollte das Maven-Modul auch in drei Schichten unterteilt werden? Wenn die Software einzeln ist, reicht es aus, sie in Pakete aufzuteilen.

Bereiten Sie im Gegenteil beim Teilen des Moduls ein übergeordnetes Modul vor

/pom.xml


<modules>
  <module>./web</module>
  <module>./mobile</module>
  <module>./domain</module>
  <module>./infrastructure</module>
</modules>

Wie

/application/pom.xml


<parent>
  <groupId>me.yong_ju.application</groupId>
  <artifactId>parent</artifactId>
  <version>...</version>
  <relativePath>../</relativePath>
</parent>
...
<dependencies>
  <dependency>
    <groupId>me.yong_ju.application</groupId>
    <artifactId>domain</artifactId>
    <version>...</version>
  </dependency>
  <dependency>
    <groupId>me.yong_ju.application</groupId>
    <artifactId>infrastructure</artifactId>
    <version>...</version>
  </dependency>
</dependencies>

Du kannst es schaffen. Wenn Sie das untergeordnete Modul zuerst im übergeordneten Modul definieren und es der Abhängigkeit hinzufügen, wird es lokal und nicht im Maven-Repository abgerufen. (Die Versionen müssen jedoch übereinstimmen)

Definition der Federkonfiguration

Wenn Sie das Paket in drei Ebenen aufteilen, tritt sofort ein Problem auf. Das liegt daran, dass wir "@ SpringBootApplication" in das Anwendungspaket einfügen, sodass der Komponentenscan von Spring nur Komponenten der Anwendungsebene injiziert.

was ist zu tun. Sie können "scanBasePackages" verwenden, um die Pakete, die Sie scannen möchten, in die obere Ebene zu ändern. Wir empfehlen dies jedoch nicht.

Hier haben wir beschlossen, eine Konfigurationsklasse mit aktiviertem Komponentenscan in der Domänen- und Infrastrukturebene vorzubereiten und die von der Anwendung verwendete Konfiguration explizit mit "@ Import" zu versehen.

@Configuration
@ComponentScan
public class DomainConfiguration {
  ...
}
@Configuration
@ComponentScan
public class InfrastructureConfiguration {
  ...
}
@SpringBootApplication
@Import({ DomainConfiguration.class, InfrastructureConfiguration.class })
public class Application {
  ...
}

Anti-Muster

Service ist eine Ressourceneinheit

Ein Muster, in dem ein Dienst, den Sie häufig sehen, nur noch ein Wrapper für das Repository ist. Es sollte in sinnvollen Betriebseinheiten gewartet werden, und wenn es noch nicht bekannt ist, ist es noch schneller, es in einen Service umzuwandeln. (In diesem Zusammenhang sehe ich häufig Muster, die in einer völlig bedeutungslosen Bedieneinheit "@ Transactional" waren.)

Zu speziell bei Montagemustern

Ich persönlich denke, dass Implementierungsmuster im Allgemeinen ein Werkzeug sind, um das Denken zu beenden und gleichzeitig schwerwiegende Designfehler bei der Softwareentwicklung mit schlechten Planungsaussichten zu vermeiden. Daher ist es ein Chaos, Zeit damit zu verschwenden, nach den besten Praktiken für alles zu suchen. Und Java und seine peripheren Frameworks entwickeln sich ständig weiter. In einigen Fällen können sie für eine weniger redundante und sicherere Implementierung verwendet werden.

Wenn ich Freizeit habe, werde ich mich auf das konzentrieren, was ich verstanden habe.

Recommended Posts

Domänengesteuerte Entwicklung mit Java und Spring Boot-Layer und Modulabteilung
Hot Deploy mit Spring Boot-Entwicklung
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
[Java] LINE-Integration mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Vergleiche Hallo Welt! Mit Spring Boot mit Java, Kotlin und Groovy
HTTPS mit Spring Boot und Let's Encrypt
Starten Sie die Entwicklung von Webanwendungen mit Spring Boot
Aufbau der Spring Boot + Docker Java-Entwicklungsumgebung
Verkaufsautomat mit Java (domänengesteuert)
[Java] Hallo Welt mit Java 14 x Spring Boot 2.3 x JUnit 5 ~
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Erstellen Sie mit Docker eine Spring Boot-Entwicklungsumgebung
Mit Spring Boot herunterladen
Versuchen Sie es mit einem DI-Container mit Laravel und Spring Boot
Wechseln Sie die Umgebung mit Spring Boot application.properties und @ Profile-Annotation
[Java] [Spring Boot] Geben Sie das Laufzeitprofil an - Spring Boot beginnend mit NetBeans
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 1 beginnen
Bis Sie mit der Entwicklung mit Spring Boot in Eclipse 2 beginnen
Versuch, SSR Vue.js mit Spring Boot und GraalJS zu verwenden
Verbinden Sie Spring Boot und Angular typsicher mit OpenAPI Generator
[Java] Entwicklung mit mehreren Dateien mittels Paket und Import
Erstellen Sie eine Java + Spring-Entwicklungsumgebung mit VirtualBox + Ubuntu (Xfce4).
Verwenden Sie Lambda-Ebenen mit Java
[Java / Kotlin] Escape-Verarbeitung (Bereinigung) für HTML5 mit Unbescape [Spring Boot]
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Java-Konfiguration mit Spring MVC
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Bis INSERT und SELECT für Postgres mit Spring Boot und Thymianblatt
Aufrufen und Verwenden der API in Java (Spring Boot)
CICS-Java-Anwendung ausführen- (4) Spring Boot-App
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
[Java] [Spring] Spring Boot 1.4-> 1.2 Downgrade Hinweis
Erstellen Sie mit Spring Boot einen Mikrodienst
Einführung von Spring Boot2, einem Java-Framework für die Webentwicklung (für Anfänger)
Mail mit Spring Boot verschicken
Erstellen Sie mit Java + Spring eine Web-APP-Entwicklungsumgebung mit Visual Studio Code
[Java] Beispielprojekt zum Entwickeln von Webanwendungen mit Spring Boot
Einfache Entwicklung von Webanwendungen mit STS und Spring Boot. In 10 Minuten.
Vergleich der WEB-Anwendungsentwicklung mit Rails und Java Servlet + JSP
Stellen Sie sich die Spring Boot-App mit dem Jib-Maven-Plugin vor und starten Sie sie mit Docker