Набор библиотек, помогающих разработчикам реализовывать модели предметной области на простой старой Java, не отвлекающей внимания.
Явно выражайте архитектурные концепции для облегчения чтения и написания кода.
Сохраняйте код, специфичный для предметной области, свободным от технических зависимостей. Сократите шаблонный код.
Автоматически создавайте документацию и проверяйте структуры реализации и вашу архитектуру.
Облегчите жизнь разработчикам.
Выразите, что фрагмент кода (пакет, класс или метод) реализует архитектурную концепцию.
Сделайте так, чтобы читатель мог легко определить, к какому типу архитектурных концепций относится данный фрагмент кода.
Разрешить интеграцию инструмента:
Дополнение кода. (Примеры инструментов: ByteBuddy с интеграцией Spring и JPA).
Проверьте архитектурные правила. (Примеры инструментов: jQAssistant, ArchUnit).
Пример: банковский домен.
import org . jmolecules . ddd . annotation .*;
@ Entity
class BankAccount {
@ Identity
final IBAN iban ;
/* ... */
}
@ ValueObject
class IBAN { /* ... */ }
@ ValueObject
record Currency { /* ... */ }
@ Repository
class Accounts { /* ... */ }
Когда мы серьезно относимся к Ubiquitous Language, мы хотим, чтобы имена (классов, методов и т. д.) содержали только слова из предметного языка. Это означает, что названия строительных блоков не должны быть частью названий. Поэтому в банковской сфере нам не нужны типы BankAccountEntity
, CurrencyVO
или даже AccountRepository
. Вместо этого нам нужны BankAccount
, Currency
и Accounts
— как в примере выше.
Тем не менее, мы хотим подчеркнуть, что данный класс (или другой архитектурный элемент) является особым строительным блоком; т.е. использует шаблон проектирования. jMolecules предоставляет набор стандартных аннотаций для строительных блоков, известных из DDD.
В качестве альтернативы вышеупомянутым аннотациям jMolecules также предоставляет набор интерфейсов, во многом основанных на идеях, представленных в серии Джона Салливана «Продвижение Enterprise DDD». Они позволяют выражать отношения между строительными блоками прямо внутри системы типов, так что компилятор может помочь проверить правильность модели, а информацию также можно легче обрабатывать с помощью отражения Java.
Identifier
— тип для представления типов, которые должны действовать как идентификаторы.
Identifiable<ID>
— все, что раскрывает идентификатор.
Entity<T extends AggregateRoot<T, ?>, ID> extends Identifiable<ID>
— объект, объявляющий, какому AggregateRoot
он принадлежит и какой идентификатор он предоставляет.
AggregateRoot<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Entity<T, ID>
— совокупный корень, являющийся принадлежащим самому себе Entity
предоставляющим выделенный Identifier
Association<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Identifiable<ID>
— явная ассоциация с целевым AggregateRoot
.
Такое расположение дает рекомендации по моделированию и позволяет легко проверить следующие правила, возможно, посредством отражения:
Принудительные специальные типы идентификаторов для каждого агрегата, чтобы избежать путаницы идентификаторов для разных агрегатов.
AggregateRoot
должен ссылаться только на экземпляры Entity
, которые объявлены принадлежащими ему.
AggregateRoot
и Entity
должны ссылаться на другие AggregateRoots
только через экземпляры Association
.
Для автоматической проверки и интеграции технологий во время выполнения см. Интеграцию jMolecules.
jmolecules-ddd
— аннотации и интерфейсы для выражения строительных блоков DDD (объектов значений, сущностей, совокупных корней и т. д.) в коде.
jmolecules-events
— аннотации и интерфейсы для выражения концепции событий в коде.
kmolecules-ddd
— версия jmolecules-ddd
на основе Kotlin для устранения проблем взаимодействия Kotlin/Java для модели на основе типов.
jMolecules предоставляет аннотации для описания архитектурных концепций более высокого уровня в соответствии со стилями многоуровневой, луковой и шестиугольной архитектуры. Они позволяют пометить весь пакет как слой, кольцо или пакет, содержащий порты и адаптеры. Они появятся в файле package-info.java
для каждого пакета, который вы хотите аннотировать, например:
package-info.java
для уровня домена: @ DomainLayer
package org . acmebank . domain ;
import org . jmolecules . architecture . layered .*;
package-info.java
для прикладного уровня: @ ApplicationLayer
package org . acmebank . application ;
import org . jmolecules . architecture . layered .*;
Таким образом, все классы в соответствующем пакете считаются частью аннотированного уровня, кольца или портом/адаптером.
Альтернативно, классы могут быть аннотированы напрямую:
import org . jmolecules . architecture . layered .*;
@ DomainLayer
@ Entity
public class BankAccount { /* ... */ }
@ ApplicationLayer
@ Service
public class TransferMoney { /* ... */ }
В настоящее время существуют аннотации для многоуровневой, луковичной и шестиугольной архитектуры.
jmolecules-architecture
— аннотации для выражения архитектурных стилей в коде.
jmolecules-cqrs-architecture
— архитектура CQRS
@Command
@CommandDispatcher
@CommandHandler
@QueryModel
jmolecules-layered-architecture
— Многоуровневая архитектура
@DomainLayer
@ApplicationLayer
@InfrastructureLayer
@InterfaceLayer
jmolecules-onion-architecture
— Луковая архитектура
Классический
@DomainModelRing
@DomainServiceRing
@ApplicationServiceRing
@InfrastructureRing
Упрощенный (не разделяет модель предметной области и сервисы)
@DomainRing
@ApplicationRing
@InfrastructureRing
jmolecules-hexagonal-architecture
— Шестиугольная архитектура
@Application
@(Primary|Secondary)Adapter
@(Primary|Secondary)Port
Аннотации и интерфейсы jMolecules можно использовать для создания технического кода, необходимого для выражения концепции в определенной целевой технологии.
Интеграция Spring, Data JPA, Data MongoDB, Data JDBC и Jackson — чтобы код с использованием аннотаций jMolecules работал в этих технологиях «из коробки».
Концепции jMolecules, выраженные в коде, можно использовать для проверки правил, вытекающих из определений концепций, и создания документации.
Плагин jQAssistant — для проверки правил, применимых к различным архитектурным стилям, строительным блокам DDD, CQRS и событиям. Также создает диаграммы PlantUML на основе информации, доступной в кодовой базе.
Правила ArchUnit — позволяют проверять связи между строительными блоками DDD.
Spring Modulith — поддерживает обнаружение компонентов jMolecules, строительных блоков DDD и событий для модели модуля и целей документации (дополнительную информацию см. в документации Spring Modulith).
Чтобы использовать jMolecules в своем проекте, просто объявите зависимость от него. Двоичные файлы выпуска доступны в центральном репозитории Maven. Чтобы избежать необходимости явно объявлять все версии, мы рекомендуем использовать jmolecules-bom
в разделе управления зависимостями.
< 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