一组库,可帮助开发人员以无干扰、简单的旧式 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 { /* ... */ }
当我们认真对待通用语言时,我们希望名称(类、方法等)仅包含领域语言中的单词。这意味着构建块的标题不应成为名称的一部分。因此,在银行领域,我们不希望BankAccountEntity
、 CurrencyVO
甚至AccountRepository
作为类型。相反,我们需要BankAccount
、 Currency
和Accounts
就像上面的例子一样。
尽管如此,我们还是想表达给定的类(或其他架构元素)是一个特殊的构建块;即使用设计模式。 jMolecules 为 DDD 中已知的构建块提供了一组标准注释。
作为上述注释的替代方案,jMolecules 还提供了一组接口,很大程度上基于 John Sullivan 的系列“Advancing 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
只能通过Association
实例引用其他AggregateRoots
。
有关自动验证和运行时技术集成,请参阅 jMolecules 集成。
jmolecules-ddd
— 在代码中表达 DDD 构建块(值对象、实体、聚合根等)的注释和接口。
jmolecules-events
— 在代码中表达事件概念的注释和接口。
kmolecules-ddd
— 基于 Kotlin 的jmolecules-ddd
风格,用于缓解基于类型的模型的 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