Eine Reihe von Bibliotheken, die Entwicklern dabei helfen, Domänenmodelle in ablenkungsfreiem, einfachem altem Java zu implementieren.
Drücken Sie Architekturkonzepte explizit aus, um das Lesen und Schreiben von Code zu erleichtern.
Halten Sie domänenspezifischen Code frei von technischen Abhängigkeiten. Boilerplate-Code reduzieren.
Erstellen Sie automatisch Dokumentationen und validieren Sie Implementierungsstrukturen und Ihre Architektur.
Machen Sie Entwicklern das Leben einfacher.
Drücken Sie aus, dass ein Codeabschnitt (ein Paket, eine Klasse oder eine Methode) ein Architekturkonzept implementiert.
Machen Sie es dem menschlichen Leser leicht, zu erkennen, um welche Art von Architekturkonzept es sich bei einem bestimmten Code handelt.
Tool-Integration zulassen:
Erweiterung des Codes. (Tooling-Beispiele: ByteBuddy mit Spring- und JPA-Integrationen).
Achten Sie auf architektonische Regeln. (Tooling-Beispiele: jQAssistant, ArchUnit).
Beispiel: Eine Banking-Domain.
import org . jmolecules . ddd . annotation .*;
@ Entity
class BankAccount {
@ Identity
final IBAN iban ;
/* ... */
}
@ ValueObject
class IBAN { /* ... */ }
@ ValueObject
record Currency { /* ... */ }
@ Repository
class Accounts { /* ... */ }
Wenn wir Ubiquitous Language ernst nehmen, wollen wir Namen (für Klassen, Methoden usw.), die nur Wörter aus der Domänensprache enthalten. Das bedeutet, dass die Titel der Bausteine nicht Teil der Namen sein sollten. In einer Bankendomäne wollen wir also nicht BankAccountEntity
, CurrencyVO
oder gar AccountRepository
als Typen. Stattdessen wollen wir BankAccount
, Currency
und Accounts
– wie im Beispiel oben.
Dennoch möchten wir zum Ausdruck bringen, dass eine bestimmte Klasse (oder ein anderes Architekturelement) ein besonderer Baustein ist; dh verwendet ein Entwurfsmuster. jMolecules bietet eine Reihe von Standardannotationen für die aus DDD bekannten Bausteine.
Als Alternative zu den oben genannten Anmerkungen bietet jMolecules auch eine Reihe von Schnittstellen an, die weitgehend auf den Ideen basieren, die in John Sullivans Serie „Advancing Enterprise DDD“ vorgestellt werden. Sie ermöglichen es, Beziehungen zwischen den Bausteinen direkt im Typsystem auszudrücken, sodass der Compiler bei der Überprüfung der Modellkorrektheit helfen kann und die Informationen auch einfacher durch Java-Reflexion verarbeitet werden können.
Identifier
– Ein Typ zur Darstellung von Typen, die als Bezeichner fungieren sollen.
Identifiable<ID>
– Alles, was eine Kennung offenlegt.
Entity<T extends AggregateRoot<T, ?>, ID> extends Identifiable<ID>
– Eine Entität, die angibt, zu welcher AggregateRoot
sie gehört und welche Kennung sie offenlegt.
AggregateRoot<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Entity<T, ID>
– ein Aggregatstamm, der eine Entity
ist, die zu sich selbst gehört und einen dedizierten Identifier
offenlegt
Association<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Identifiable<ID>
– eine explizite Zuordnung zu einem Ziel AggregateRoot
.
Diese Anordnung gibt Orientierung für die Modellierung und ermöglicht die einfache Überprüfung der folgenden Regeln, möglicherweise durch Reflexion:
Erzwungene, dedizierte Bezeichnertypen pro Aggregat, um eine Verwechslung von Bezeichnern für verschiedene Aggregate zu vermeiden.
AggregateRoot
darf nur auf Entity
-Instanzen verweisen, die als dazugehörig deklariert wurden.
AggregateRoot
und Entity
s dürfen nur über Association
-Instanzen auf andere AggregateRoots
verweisen.
Informationen zur automatisierten Verifizierung und Integration der Laufzeittechnologie finden Sie unter jMolecules Integrations.
jmolecules-ddd
– Annotationen und Schnittstellen zum Ausdrücken von DDD-Bausteinen (Wertobjekte, Entitäten, Aggregatwurzeln usw.) im Code.
jmolecules-events
– Annotationen und Schnittstellen, um das Konzept von Ereignissen im Code auszudrücken.
kmolecules-ddd
– Kotlin-basierte Variante von jmolecules-ddd
um Kotlin/Java-Interop-Probleme für das typbasierte Modell zu mildern.
jMolecules bietet Anmerkungen zur Beschreibung übergeordneter Architekturkonzepte, die den Stilen der Schicht-, Zwiebel- und Sechseckarchitektur folgen. Sie ermöglichen es Ihnen, ein gesamtes Paket als Schicht, Ring oder als Paket mit Ports und Adaptern zu kennzeichnen. Diese würden in der Datei package-info.java
für jedes Paket erscheinen, das Sie mit Anmerkungen versehen möchten, z. B.:
package-info.java
für die Domänenebene: @ DomainLayer
package org . acmebank . domain ;
import org . jmolecules . architecture . layered .*;
package-info.java
für die Anwendungsschicht: @ ApplicationLayer
package org . acmebank . application ;
import org . jmolecules . architecture . layered .*;
Auf diese Weise werden alle Klassen im jeweiligen Paket als Teil der annotierten Schicht, des Rings oder als Port/Adapter betrachtet.
Alternativ können Klassen direkt annotiert werden:
import org . jmolecules . architecture . layered .*;
@ DomainLayer
@ Entity
public class BankAccount { /* ... */ }
@ ApplicationLayer
@ Service
public class TransferMoney { /* ... */ }
Derzeit gibt es Anmerkungen für Layered-, Onion- und Hexagonal-Architektur.
jmolecules-architecture
– Anmerkungen, um Architekturstile im Code auszudrücken.
jmolecules-cqrs-architecture
– CQRS-Architektur
@Command
@CommandDispatcher
@CommandHandler
@QueryModel
jmolecules-layered-architecture
– Schichtarchitektur
@DomainLayer
@ApplicationLayer
@InfrastructureLayer
@InterfaceLayer
jmolecules-onion-architecture
– Zwiebelarchitektur
Klassiker
@DomainModelRing
@DomainServiceRing
@ApplicationServiceRing
@InfrastructureRing
Vereinfacht (trennt Domänenmodell und Dienste nicht)
@DomainRing
@ApplicationRing
@InfrastructureRing
jmolecules-hexagonal-architecture
– Sechseckige Architektur
@Application
@(Primary|Secondary)Adapter
@(Primary|Secondary)Port
Die jMolecules-Annotationen und -Schnittstellen können verwendet werden, um technischen Code zu generieren, der zum Ausdrücken des Konzepts in einer bestimmten Zieltechnologie erforderlich ist.
Spring-, Data JPA-, Data MongoDB-, Data JDBC- und Jackson-Integration – damit Code mit jMolecules-Annotationen in diesen Technologien sofort funktioniert.
Die im Code ausgedrückten jMolecules-Konzepte können verwendet werden, um Regeln zu überprüfen, die sich aus den Definitionen der Konzepte ergeben, und um Dokumentation zu erstellen.
jQAssistant-Plugin – zur Überprüfung der Regeln, die für die verschiedenen Architekturstile, DDD-Bausteine, CQRS und Ereignisse gelten. Erstellt außerdem PlantUML-Diagramme aus den in der Codebasis verfügbaren Informationen.
ArchUnit-Regeln – ermöglichen die Überprüfung von Beziehungen zwischen DDD-Bausteinen.
Spring Modulith – unterstützt die Erkennung von jMolecules-Komponenten, DDD-Bausteinen und Ereignissen für Modulmodell- und Dokumentationszwecke (weitere Informationen finden Sie in der Spring Modulith-Dokumentation).
Um jMolecules in Ihrem Projekt zu verwenden, deklarieren Sie einfach eine Abhängigkeit dazu. Release-Binärdateien sind im zentralen Maven-Repository verfügbar. Um zu vermeiden, dass alle Versionen explizit deklariert werden müssen, empfehlen wir die Verwendung von jmolecules-bom
in Ihrem Abschnitt zur Abhängigkeitsverwaltung.
< dependency >
< groupId >org.jmolecules</ groupId >
< artifactId >jmolecules-ddd</ artifactId >
< version >1.9.0</ version >
</ dependency >
repositories {
mavenCentral()
}
dependencies {
implementation( " org.jmolecules:jmolecules-ddd:1.9.0 " )
}
mvn release:prepare -DscmReleaseCommitComment="$ticketId - Release version $version." -DscmDevelopmentCommitComment="$ticketId - Prepare next development iteration."
mvn release:perform -Dgpg.keyname=$keyname