:toc:
= jMolecules - Java的架构抽象
一组库,帮助开发人员使用无干扰的纯Java实现领域模型。
== jMolecules背后的理念
- 明确表达架构概念,使代码更易读写。
- 保持特定领域的代码不受技术依赖影响。减少样板代码。
- 自动生成文档并验证实现结构和架构。
== 目标
- 让开发人员的工作更轻松。
- 表达一段代码(包、类或方法)实现了某个架构概念。
- 让人类读者容易确定给定代码属于哪种架构概念。
- 允许工具集成: a. 增强代码。(工具示例:使用Spring和JPA集成的ByteBuddy)。 b. 检查架构规则。(工具示例:jQAssistant、ArchUnit)。
== 用例:表达DDD概念
示例:银行领域。
=== 使用基于注解的模型
[source,java]
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在https://scabl.blogspot.com/p/advancing-enterprise-ddd.html["推进企业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
实例引用其他AggregateRoot
。
有关自动验证和运行时技术集成,请参见https://github.com/xmolecules/jmolecules-integrations#jmoleculestechnology-integrations[jMolecules集成]。
=== 可用库
- link:jmolecules-ddd[
jmolecules-ddd
] -- 在代码中表达DDD构建块(值对象、实体、聚合根等)的注解和接口。 - link:jmolecules-events[
jmolecules-events
] -- 在代码中表达事件概念的注解和接口。 - link:kmolecules-ddd[
kmolecules-ddd
] --jmolecules-ddd
的Kotlin版本,用于缓解基于类型模型的Kotlin/Java互操作问题。
== 用例:表达架构概念 jMolecules提供了注解来描述遵循分层、洋葱和六边形架构风格的高级架构概念。 它们允许你将一个包标记为层、环,或包含端口和适配器。
[source,java]
import org.jmolecules.architecture.layered.*;
@DomainLayer package org.acmebank.domain;
@ApplicationLayer package org.acmebank.application;
这样,相应包中的所有类都被认为是被注解的层、环的一部分,或被视为端口/适配器。
或者,可以直接注解类:
[source,java]
import org.jmolecules.architecture.layered.*;
@DomainLayer @Entity public class BankAccount { /* ... */ }
@ApplicationLayer @Service public class TransferMoney { /* ... */ }
目前存在分层、洋葱和六边形架构的注解。
=== 可用库
- link:jmolecules-architecture[
jmolecules-architecture
] -- 在代码中表达架构风格的注解。 ** link:jmolecules-architecture/jmolecules-cqrs-architecture[jmolecules-cqrs-architecture
] -- CQRS架构 ***@Command
***@CommandDispatcher
***@CommandHandler
***@QueryModel
** link:jmolecules-architecture/jmolecules-layered-architecture[jmolecules-layered-architecture
] -- 分层架构 ***@DomainLayer
***@ApplicationLayer
***@InfrastructureLayer
***@InterfaceLayer
** link:jmolecules-architecture/jmolecules-onion-architecture[jmolecules-onion-architecture
] -- 洋葱架构 *** 经典 ****@DomainModelRing
****@DomainServiceRing
****@ApplicationServiceRing
****@InfrastructureRing
*** 简化版(不分离领域模型和服务) ****@DomainRing
****@ApplicationRing
****@InfrastructureRing
** link:jmolecules-architecture/jmolecules-hexagonal-architecture[jmolecules-hexagonal-architecture
] -- 六边形架构 ***@Application
***@(Primary|Secondary)Adapter
***@(Primary|Secondary)Port
== 用例:生成技术样板代码
jMolecules注解和接口可用于生成在某个目标技术中表达概念所需的技术代码。
=== 可用库
- https://github.com/xmolecules/jmolecules-integrations[Spring、Data JPA、Data MongoDB、Data JDBC和Jackson集成] -- 使使用jMolecules注解的代码在这些技术中可以开箱即用。
== 用例:验证和记录架构
在代码中表达的jMolecules概念可用于验证源自概念定义的规则并生成文档。
=== 可用库
- https://github.com/jqassistant-plugin/jqassistant-jmolecules-plugin[jQAssistant插件] -- 验证适用于不同架构风格、DDD构建块、CQRS和事件的规则。还可以从代码库中可用的信息创建PlantUML图表。
- https://github.com/xmolecules/jmolecules-integrations/tree/main/jmolecules-archunit[ArchUnit规则] -- 允许验证DDD构建块之间的关系。
- https://github.com/spring-projects/spring-modulith[Spring Modulith] -- 支持检测jMolecules组件、DDD构建块和事件,用于模块模型和文档目的(更多信息请参见https://docs.spring.io/spring-modulith/docs/current-SNAPSHOT/reference/html/#documentation/ [Spring Modulith文档])。
== 安装 要在项目中使用jMolecules,只需声明对它的依赖即可。 发布的二进制文件可从Maven中央仓库获得。 为避免必须明确声明所有版本,我们建议在依赖管理部分使用https://github.com/xmolecules/jmolecules-bom[`jmolecules-bom`]。
=== Maven
[source,xml]
=== Gradle
[source,groovy]
repositories { mavenCentral() } dependencies { implementation("org.jmolecules:jmolecules-ddd:1.9.0") }
== 开发者信息
=== 发布说明
mvn release:prepare -DscmReleaseCommitComment="$ticketId - 发布版本 $version。" -DscmDevelopmentCommitComment="$ticketId - 准备下一个开发迭代。"
mvn release:perform -Dgpg.keyname=$keyname