Sekumpulan perpustakaan untuk membantu pengembang mengimplementasikan model domain di Java lama yang bebas gangguan.
Ekspresikan konsep arsitektur secara eksplisit untuk memudahkan pembacaan dan penulisan kode.
Jaga agar kode khusus domain bebas dari ketergantungan teknis. Kurangi kode boilerplate.
Secara otomatis menghasilkan dokumentasi dan memvalidasi struktur implementasi dan arsitektur Anda.
Jadikan hidup pengembang lebih mudah.
Nyatakan bahwa sepotong kode (paket, kelas, atau metode) mengimplementasikan konsep arsitektur.
Permudah pembaca manusia untuk menentukan jenis konsep arsitektur apa yang merupakan bagian dari kode tertentu.
Izinkan integrasi alat:
Augmentasi kode. (Contoh perkakas: ByteBuddy dengan integrasi Spring dan JPA).
Periksa aturan arsitektur. (Contoh perkakas: jQAssistant, ArchUnit).
Contoh: Domain perbankan.
import org . jmolecules . ddd . annotation .*;
@ Entity
class BankAccount {
@ Identity
final IBAN iban ;
/* ... */
}
@ ValueObject
class IBAN { /* ... */ }
@ ValueObject
record Currency { /* ... */ }
@ Repository
class Accounts { /* ... */ }
Saat kami menganggap serius Ubiquitous Language, kami menginginkan nama (untuk kelas, metode, dll.) yang hanya berisi kata-kata dari bahasa domain. Artinya, judul elemen penyusun tidak boleh menjadi bagian dari nama. Jadi dalam domain perbankan kami tidak ingin BankAccountEntity
, CurrencyVO
atau bahkan AccountRepository
sebagai tipe. Sebaliknya, kami ingin BankAccount
, Currency
dan Accounts
– seperti pada contoh di atas.
Namun, kami ingin menyatakan bahwa kelas tertentu (atau elemen arsitektur lainnya) adalah blok penyusun khusus; yaitu menggunakan pola desain. jMolecules menyediakan serangkaian anotasi standar untuk blok penyusun yang diketahui dari DDD.
Sebagai alternatif dari anotasi yang disebutkan di atas, jMolecules juga menyediakan serangkaian antarmuka, sebagian besar didasarkan pada ide yang disajikan dalam seri "Advancing Enterprise DDD" karya John Sullivan. Mereka memungkinkan mengekspresikan hubungan antara blok penyusun langsung dalam sistem tipe, sehingga kompiler dapat membantu memverifikasi kebenaran model dan informasi juga dapat diproses dengan refleksi Java dengan lebih mudah.
Identifier
— Tipe untuk mewakili tipe yang seharusnya bertindak sebagai pengidentifikasi.
Identifiable<ID>
— Apa pun yang memperlihatkan pengenal.
Entity<T extends AggregateRoot<T, ?>, ID> extends Identifiable<ID>
— Sebuah entitas, yang mendeklarasikan AggregateRoot
miliknya dan pengidentifikasi mana yang diekspos.
AggregateRoot<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Entity<T, ID>
— akar agregat menjadi Entity
miliknya sendiri yang mengekspos Identifier
khusus
Association<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Identifiable<ID>
— pengaitan eksplisit ke target AggregateRoot
.
Pengaturan ini memberikan panduan untuk pemodelan dan memungkinkan verifikasi aturan berikut dengan mudah, kemungkinan melalui refleksi:
Jenis pengenal khusus yang diterapkan per agregat untuk menghindari tercampurnya pengidentifikasi untuk agregat yang berbeda.
AggregateRoot
hanya boleh merujuk pada instance Entity
yang dinyatakan sebagai miliknya.
AggregateRoot
s dan Entity
s hanya boleh merujuk ke AggregateRoots
lain melalui instans Association
.
Untuk verifikasi otomatis dan integrasi teknologi runtime, lihat Integrasi jMolecules.
jmolecules-ddd
— anotasi dan antarmuka untuk mengekspresikan blok penyusun DDD (objek nilai, entitas, akar agregat, dll.) dalam kode.
jmolecules-events
— anotasi dan antarmuka untuk mengekspresikan konsep peristiwa dalam kode.
kmolecules-ddd
— Varian jmolecules-ddd
berbasis Kotlin untuk memitigasi masalah interop Kotlin/Java untuk model berbasis tipe.
jMolecules memberikan anotasi untuk mendeskripsikan konsep arsitektur tingkat tinggi mengikuti gaya Arsitektur Berlapis, Bawang, dan Heksagonal. Mereka memungkinkan Anda menandai seluruh paket sebagai lapisan, cincin, atau yang berisi port dan adaptor. Ini akan muncul di file package-info.java
untuk setiap paket yang ingin Anda beri anotasi, misalnya:
package-info.java
untuk lapisan Domain: @ DomainLayer
package org . acmebank . domain ;
import org . jmolecules . architecture . layered .*;
package-info.java
untuk lapisan Aplikasi: @ ApplicationLayer
package org . acmebank . application ;
import org . jmolecules . architecture . layered .*;
Dengan begitu, semua kelas dalam paket masing-masing dianggap sebagai bagian dari lapisan beranotasi, ring, atau dianggap sebagai port/adaptor.
Alternatifnya, kelas dapat dianotasi secara langsung:
import org . jmolecules . architecture . layered .*;
@ DomainLayer
@ Entity
public class BankAccount { /* ... */ }
@ ApplicationLayer
@ Service
public class TransferMoney { /* ... */ }
Saat ini, ada anotasi untuk Arsitektur Berlapis, Bawang, dan Heksagonal.
jmolecules-architecture
— anotasi untuk mengekspresikan gaya arsitektur dalam kode.
jmolecules-cqrs-architecture
- Arsitektur CQRS
@Command
@CommandDispatcher
@CommandHandler
@QueryModel
jmolecules-layered-architecture
— Arsitektur berlapis
@DomainLayer
@ApplicationLayer
@InfrastructureLayer
@InterfaceLayer
jmolecules-onion-architecture
- Arsitektur bawang
Klasik
@DomainModelRing
@DomainServiceRing
@ApplicationServiceRing
@InfrastructureRing
Sederhana (tidak memisahkan model domain dan layanan)
@DomainRing
@ApplicationRing
@InfrastructureRing
jmolecules-hexagonal-architecture
- Arsitektur heksagonal
@Application
@(Primary|Secondary)Adapter
@(Primary|Secondary)Port
Anotasi dan antarmuka jMolecules dapat digunakan untuk menghasilkan kode teknis yang diperlukan untuk mengekspresikan konsep dalam teknologi target tertentu.
Integrasi Spring, Data JPA, Data MongoDB, Data JDBC, dan Jackson — untuk membuat kode menggunakan anotasi jMolecules berfungsi dengan baik dalam teknologi tersebut.
Konsep jMolecules yang diungkapkan dalam kode dapat digunakan untuk memverifikasi aturan yang berasal dari definisi konsep dan menghasilkan dokumentasi.
plugin jQAssistant — untuk memverifikasi aturan yang berlaku pada berbagai gaya arsitektur, blok penyusun DDD, CQRS, dan acara. Juga membuat diagram PlantUML dari informasi yang tersedia di basis kode.
Aturan ArchUnit — memungkinkan untuk memverifikasi hubungan antara blok penyusun DDD.
Spring Modulith — mendukung deteksi komponen jMolecules, blok penyusun DDD, dan peristiwa untuk model modul dan tujuan dokumentasi (lihat dokumentasi Spring Modulith untuk informasi lebih lanjut).
Untuk menggunakan jMolecules di proyek Anda, cukup nyatakan ketergantungannya. Biner rilis tersedia dari repositori pusat Maven. Untuk menghindari keharusan mendeklarasikan semua versi secara eksplisit, sebaiknya gunakan jmolecules-bom
di bagian manajemen ketergantungan Anda.
< 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