news 2026/11/5 16:21:41

COLA 5 完整实践指南:整洁面向对象分层架构、Archetype 脚手架与核心组件详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
COLA 5 完整实践指南:整洁面向对象分层架构、Archetype 脚手架与核心组件详解
  • 后端

【免费下载链接】COLA

🥤 COLA: Clean Object-oriented & Layered Architecture

项目地址:https://gitcode.com/gh_mirrors/col/COLA
点击查看免费下载

本文基于开源仓库 COLA 的 README.md 编写。COLA(Clean Object-oriented and Layered Architecture)是一套由阿里巴巴开源团队沉淀的"整洁面向对象分层架构"框架,主张以业务为核心、解耦外部依赖、分离业务复杂度与技术复杂度,并通过可落地的 Archetype 脚手架与通用组件帮助 Java 开发者快速构建符合整洁架构思想的 Spring Boot 应用。读完本文,你将掌握 COLA 的整体架构分层思想、两条 Archetype 生成命令的完整用法、六大通用组件的职责与内部实现原理,以及如何基于生成的项目结构快速启动并验证一个可运行的 Web 应用。

一、COLA 是什么:架构的"要素"与"结构"

COLA 是Clean Object-oriented and Layered Architecture的缩写,意为"整洁面向对象分层架构"。它的命名本身就点明了它的两个内核:

  • 要素(要素结构):架构由"要素"组成,要素是组成架构的重要元素;
  • 结构:结构是要素之间的关系。

应用架构的意义在于:定义一套良好的结构,治理应用复杂度、降低系统熵值,帮助业务系统从"随心所欲的混乱状态"走向"井井有条的有序状态"。这正是 COLA 架构的诞生动机——通过良好的分层结构、良好的包结构定义,治理混乱不堪的业务应用系统。

在理念上,COLA 与六边形架构(Hexagonal Architecture)、洋葱圈架构(Onion Architecture)、整洁架构(Clean Architecture)一脉相承:都提倡以业务为核心,解耦外部依赖,分离业务复杂度与技术复杂度。而 COLA 的独特之处在于,除了架构思想之外,它还提供了可落地的工具和实践指导——即下文要重点讲解的 Archetype 工程脚手架与通用组件库。

从仓库的聚合工程结构(见根目录 pom.xml)可以确认,COLA 由两大部分构成:

  1. COLA 架构(cola-archetypes 目录):提供工程脚手架,帮助开发者快速生成符合 COLA 分层规范的应用;
  2. COLA 组件(cola-components 目录):沉淀了一批通用组件,直接提升研发效率。

二、COLA Archetypes:一键生成整洁分层应用

好的应用架构都遵循共同模式,但 COLA 的可贵之处在于"可落地"。为了快速创建满足 COLA 架构的应用,仓库在 cola-archetypes 目录下提供了三个 archetype(Maven 原型工程),其中面向业务应用的主要有两个:

Archetype用途
cola-archetype-service创建纯后端服务工程(不包含 Web 展示层)
cola-archetype-web创建adapter 与后端服务一体的 Web 应用工程

另外,5.0.0 版本还新增了cola-archetype-light,支持基于 package 的轻量级分层架构(详见后文版本迭代部分)。三个 archetype 都聚合在 cola-archetypes/pom.xml 中统一管理。

1. 创建 Web 应用(adapter + 后端一体)

在任意空目录下执行以下 Maven 命令:

mvn archetype:generate \ -DgroupId=com.alibaba.cola.demo.web \ -DartifactId=demo-web \ -Dversion=1.0.0-SNAPSHOT \ -Dpackage=com.alibaba.demo \ -DarchetypeArtifactId=cola-framework-archetype-web \ -DarchetypeGroupId=com.alibaba.cola \ -DarchetypeVersion=5.0.0

参数说明:

  • -DgroupId/-DartifactId/-Dversion:生成工程的 GAV 坐标,按需替换;
  • -Dpackage:生成工程的根包名,源码会以该包名展开;
  • -DarchetypeArtifactId:指定使用cola-framework-archetype-web(注意 archetype 的 artifactId 前缀为cola-framework-archetype-*);
  • -DarchetypeGroupId=com.alibaba.cola与-DarchetypeVersion=5.0.0:定位 COLA 官方发布的 archetype 版本。

2. 创建纯后端 Service 工程

如果不需要 Web 展示层,执行下面的命令:

mvn archetype:generate \ -DgroupId=com.alibaba.cola.demo.service \ -DartifactId=demo-service \ -Dversion=1.0.0-SNAPSHOT \ -Dpackage=com.alibaba.demo \ -DarchetypeArtifactId=cola-framework-archetype-service \ -DarchetypeGroupId=com.alibaba.cola \ -DarchetypeVersion=5.0.0

两条命令仅-DgroupId、-DartifactId与-DarchetypeArtifactId不同,其余参数保持一致。

3. 生成后的工程结构长什么样?

命令执行成功后,会得到一个多模块 Maven 工程。以cola-archetype-web为例(见 cola-archetype-web 的 archetype-resources),生成的项目大致包含以下子模块,恰好体现了 COLA 的分层思想:

子模块职责典型内容
*-client对外 API 与 DTO 定义api/CustomerServiceI、dto/CustomerAddCmd、dto/CustomerListByNameQry、dto/data/CustomerDTO、dto/event/CustomerCreatedEvent
*-app应用服务层,编排用例customer/CustomerServiceImpl、customer/executor/CustomerAddCmdExe、customer/executor/query/CustomerListByNameQryExe
*-domain领域层,承载核心业务domain/customer/Customer、domain/customer/gateway/CustomerGateway、domain/customer/domainservice/CreditChecker
*-infrastructure基础设施层,落地技术细节customer/CustomerDO、customer/CustomerMapper、customer/CustomerGatewayImpl
*-adapter(仅 web 版)对外适配层,六边形架构中的入站适配器web/CustomerController、mobile/CustomerMobileAdaptor、wap/CustomerWapAdaptor
start启动模块Application.java、application.properties

其中*-adapter模块的命名直接呼应六边形架构:web / mobile / wap 三种适配器分别对应不同端的外层入口,而controller在 3.1.0 版本中正式更名为adapter。从 CustomerController.java 可以看到,Controller 只负责接收 HTTP 请求并转发给CustomerServiceI接口,本身不包含任何业务逻辑:

@RestController public class CustomerController { @Autowired private CustomerServiceI customerService; @GetMapping(value = "/helloworld") public String helloWorld(){ return "Hello, welcome to COLA world!"; } @GetMapping(value = "/customer") public MultiResponse<CustomerDTO> listCustomerByName(@RequestParam(required = false) String name){ CustomerListByNameQry customerListByNameQry = new CustomerListByNameQry(); customerListByNameQry.setName(name); return customerService.listByName(customerListByNameQry); } @PostMapping(value = "/customer") public Response addCustomer(@RequestBody CustomerAddCmd customerAddCmd){ return customerService.addCustomer(customerAddCmd); } }

而 CustomerServiceImpl.java 展示了应用服务层的典型写法:通过@CatchAndLog注解接入统一异常处理与日志(对应下文cola-component-catchlog-starter组件),并把命令(Cmd)和查询(Qry)分别委托给对应的 Executor 执行,实现 CQRS 风格的用例编排。

三、如何运行生成的应用

生成工程后,按以下步骤即可启动一个可运行的 Spring Boot 应用:

  1. 构建项目:在生成的项目根目录下执行mvn install;如果不想运行测试,可加上-DskipTests参数跳过。
  2. 启动应用:进入start模块目录,执行mvn spring-boot:run。启动成功后可以看到 Spring Boot 的启动成功日志。
  3. 验证功能:生成的应用中已经内置了一个简单的 Rest 接口,直接在浏览器访问 http://localhost:8080/helloworld 即可看到欢迎响应(返回Hello, welcome to COLA world!)。

以cola-archetype-web的 start 模块为例,其 application.properties 默认配置了 MySQL 数据源:

project.name=${artifactId} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root

注意:数据源地址localhost:3306/test、账号root/root均为模板默认值,实际使用时需要按自己的数据库环境修改。helloworld接口不依赖数据库,可直接验证应用是否启动成功。

四、COLA 六大通用组件:职责与源码级原理

除了脚手架,COLA 还沉淀了一批"开箱即用"的通用组件,收拢在 cola-components 目录下。README 中明确列出的组件及依赖关系如下:

组件名称功能依赖
cola-component-dto定义 DTO 格式,包括分页无
cola-component-exception定义异常格式,主要有BizException和SysException无
cola-component-statemachine状态机组件无
cola-component-domain-starterSpring 托管的领域实体组件无
cola-component-catchlog-starter异常处理和日志组件exception、dto组件
cola-component-extension-starter扩展点组件无

1. cola-component-dto:统一数据交互格式

该组件制定了 DTO 的相关规范,目的有二:一是为了复用,二是使应用层面的 Logging 和异常处理 AOP 成为可能(关于 Logging 和异常处理的更多信息可参考cola-component-catchlog-starter,见其 README)。

在代码层面,DTO 体系的根是抽象类 DTO.java,它实现Serializable,并在注释中明确指出Command 与 Query 属于 CQRS 概念。其下主要派生两类:

  • 请求类:Command(命令,改变系统状态)、Query(查询,不改变状态)、PageQuery(分页查询参数);
  • 响应类:Response及其子类。

核心响应类 Response.java 定义了统一的响应三要素:success(是否成功)、errCode(错误码)、errMessage(错误信息),并提供了两个静态工厂方法:

public static Response buildSuccess() { ... } public static Response buildFailure(String errCode, String errMessage) { ... }

在此基础上:

  • MultiResponse.java 用于返回批量数据(如条件查询列表),提供of(Collection<T> data)静态工厂,getData()在数据为空时返回空列表而不是 null;
  • PageResponse.java 用于分页查询结果,包含totalCount、pageSize、pageIndex、data四个字段,并内置健壮性处理——当pageSize或pageIndex小于 1 时自动归 1,还提供了getTotalPages()计算总页数。

正是这种统一的响应格式,让下文catchlog组件的 AOP 能根据方法的返回类型(Response、MultiResponse、PageResponse、SingleResponse)自动构造对应的失败响应。

2. cola-component-exception:统一异常体系

该组件定义了统一的异常格式,核心是BizException与SysException两大类,二者都继承自 BaseException。以 BizException.java 为例,它的 Javadoc 明确说明:"BizException is known Exception, no need retry"——即业务异常是已知异常,无需重试;而未指定错误码时默认使用BIZ_ERROR。与之相对的SysException则代表系统级异常。异常体系中还包含ExceptionFactory(异常工厂)与Assert(断言工具),便于在代码中快速抛出统一格式的异常。

3. cola-component-statemachine:轻量级状态机 DSL

该组件是"简单、轻量、性能极高的状态机 DSL 实现,解决业务中的状态流转问题"(见其 README)。从源码结构看(cola-component-statemachine),它提供了完整的 Builder 体系:

  • StateMachineBuilderFactory(状态机工厂)+StateMachineBuilder(状态机构建器);
  • ExternalTransitionBuilder/InternalTransitionBuilder/ExternalTransitionsBuilder/ParallelTransitionBuilder等过渡构建器;
  • StateMachine/State/Transition/Event等核心模型,以及Action(动作)、Condition(条件)等回调接口;
  • 附带PlantUMLVisitor、SysOutVisitor等访问器,可将状态机导出为 PlantUML 图或控制台输出,方便可视化调试。

组件还提供了对应的测试用例(cola-component-statemachine/src/test),如StateMachineTest、StateMachinePlantUMLTest、StateMachineChoiceTest,可作为使用参考。

4. cola-component-domain-starter:Spring 托管的领域实体

该组件让领域实体可以被 Spring 容器托管。从源码看(cola-component-domain-starter),其核心包括:

  • Entity:领域实体标记类,配合DomainFactory在@Component场景下使用;
  • DomainFactory:领域实体工厂,负责创建被 Spring 管理的领域对象;
  • DomainAutoConfiguration:Spring Boot 自动装配入口,通过ApplicationContextHelper获取容器上下文。

这种"Spring 托管领域实体"的设计,让贫血模型(仅数据)的实体可以借助工厂获得容器注入的能力,从而承载更丰富的领域行为。

5. cola-component-catchlog-starter:异常处理与日志切面

该组件是 README 组件表中唯一有依赖的组件(依赖exception与dto),负责统一捕获异常并把异常转换为标准 Response 输出,同时记录请求/响应日志。

其核心机制如下:

  • 自定义注解 CatchAndLog.java,可标注在方法或类上(@Target({ElementType.METHOD, ElementType.TYPE}));
  • 切面 CatchLogAspect.java 使用@Pointcut("@within(CatchAndLog) && execution(public * *(..))")拦截所有标注了@CatchAndLog的类的 public 方法,并设置@Order(1)保证切面优先级;
  • around环绕通知统一执行logRequest→joinPoint.proceed()→logResponse流程,并统计耗时(COST: {}ms);
  • handleException按异常类型分流处理:
    • BizException:仅warn级日志(debug 模式下才打印堆栈),返回对应错误码与消息;
    • SysException:error级日志并打印堆栈;
    • 其他未知异常:统一记为UNKNOWN_ERROR;
    • 无论哪种异常,都通过ResponseHandlerFactory根据方法返回类型(Response/MultiResponse等)构造对应的失败响应——这正是 dto 组件统一格式的价值所在。

在 archetype 生成的应用中,CustomerServiceImpl上的@CatchAndLog注解就是该组件的典型使用方式。

6. cola-component-extension-starter:扩展点组件

扩展点组件用于解决多业务、多场景下的差异化逻辑问题,是 COLA 支持业务定制化(如不同 BU 的客户校验规则不同)的关键能力。其核心源码位于 cola-component-extension-starter:

  • Extension.java:扩展注解,包含bizId、useCase、scenario三个维度,默认值来自BizScenario的默认常量,即一个扩展由"业务 + 用例 + 场景"三元组唯一定位;
  • ExtensionExecutor.java:扩展执行器,locateExtension方法实现了从全量坐标到默认坐标逐级回退的查找策略。源码注释给出了清晰的检索路径:
    1. 先用完整命名空间查找(如ali.tmall.supermarket);
    2. 未命中则退回默认场景(如ali.tmall.#defaultScenario#);
    3. 再退回默认用例 + 默认场景(如ali.#defaultUseCase#.#defaultScenario#);
    4. 仍找不到则抛出ExtensionException(extension_not_found);
  • ExtensionRepository:扩展注册仓库,以ExtensionCoordinate为 key 保存所有已注册扩展;
  • ExtensionBootstrap/ExtensionRegister:负责在 Spring 启动时扫描并注册所有@Extension标注的 Bean。

组件自带的测试(cola-component-extension-starter/src/test)如ExtensionTest、MultiCoordinateTests、ExtensionRegisterTest展示了多业务、多场景坐标下的扩展解析行为,可直接参考。

五、版本迭代与演进脉络

README 的"版本迭代"章节梳理了 COLA 的演进历史(其中早期版本附有作者 Frank Zhang 的系列博客链接,仓库内不包含这些文章正文,此处仅保留仓库可验证的要点):

  • 5.0.0 版本:
    1. 支持 JDK 17 与 Spring Boot 3.x;
    2. 新增cola-archetype-light,支持基于 package 的轻量级分层架构(不需要拆分成多模块,而是通过包名划分 adapter / application / domain / infrastructure 层次,其模板可参考 cola-archetype-light 的 archetype-resources);
    3. 新增cola-component-unittest组件,支持新的单元测试模式;
    4. 增强cola-component-test-container组件,支持 JUnit 5 的 Extension。
  • 3.1.0 版本:进一步简化cola-core,只保留扩展能力;将exception从cola-core移入cola-common;对 archetype 的分包逻辑重构为按domain划分;将cola-archetype-web中的controller改名为adapter,呼应六边形架构命名。
  • 2.0.0 / 1.0.0 版本:属于早期架构版本,相关迭代说明以作者博客文章为准(仓库内未收录正文)。

事实说明:README 中 4.0.0、3.0.0、2.0.0、1.0.0 等早期版本仅提供了外部博客链接,本文只转述 5.0.0 与 3.1.0 中可被仓库源码验证的内容,不展开无法核实的外部资料。

六、总结与上手路径

COLA 的价值总结起来是两条:

  1. 架构层面:给出了一套以业务为核心、强调分层解耦的应用架构规范,并且用 Archetype 把它变成"一行命令即可生成"的工程模板,让整洁架构不再停留在 PPT 上;
  2. 组件层面:把 DTO 规范、异常体系、状态机、领域实体托管、异常日志切面、扩展点等通用能力沉淀为可独立引用的组件,直接提升研发效率与一致性。

推荐的快速上手路径:

  1. 阅读本文第二章,用cola-framework-archetype-web命令生成一个 Web 工程;
  2. 按第三章执行mvn install与mvn spring-boot:run,访问 http://localhost:8080/helloworld 验证启动;
  3. 对照第四章组件说明,逐个阅读 cola-components 下的组件源码与其自带测试,理解每个组件在生成工程中的落点(例如@CatchAndLog在CustomerServiceImpl上的作用);
  4. 需要构建多版本兼容的复杂业务时,深入 cola-component-extension-starter 与 cola-component-statemachine 的测试用例,掌握扩展点坐标与状态机 DSL 的用法。

如果想要直接查看完整代码与示例工程,可通过git clone https://link.gitcode.com/i/365bc158dbf969533ecda37a810526b7获取本仓库,其中 cola-samples 目录下还提供了 craftsman(工匠平台)等完整示例应用,可作为学习 COLA 落地写法的进阶材料。

  • 后端

【免费下载链接】COLA

🥤 COLA: Clean Object-oriented & Layered Architecture

项目地址:https://gitcode.com/gh_mirrors/col/COLA
点击查看免费下载

相关推荐

上一篇:Bash 3 中文手册精读:从启动选项、启动文件到重定向的完整实战指南
下一篇:Zeek 内置插件包(builtin-plugins)详解:JavaScript 引擎集成与云端 UDP 抓包源

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 14:18:08

模拟电路全系列复习题:从二极管到运放的体系化刷题指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 16:20:46

集合关系图怎么做到“面积即数量“:从韦恩图到 UpSet 的取舍

想画一个韦恩图时&#xff0c;真正卡住人的通常不是画圆&#xff0c;而是三个技术问题&#xff1a;手工画的圆面积能不能反映真实数量&#xff1f;集合超过 3 个怎么办&#xff1f;导出到论文或印刷品时字体和矢量怎么处理&#xff1f; 这篇不聊工具怎么挑&#xff0c;只解决这…

作者头像 李华
网站建设 2026/10/28 8:37:39

CSDN 多平台同步助手:一键分发,排版无损,安全高效

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 16:20:46

基于Python的电影受众群体特征分析与可视化实战

提到“基于Python的电影受众群体特征研究”这个毕设题目&#xff0c;很多准备开题的同学第一个反应是&#xff1a;这方向是不是太普通了&#xff1f;我自己的看法是&#xff0c;普通题目更容易做出完整度和深度。它把Python数据处理、统计分析、可视化、机器学习串成了一条完整…

作者头像 李华
网站建设 2026/10/29 3:03:44

我们在联想 ThinkStation PGX 上搭了一个“AI 编辑部“

在输入框里只敲了五个字&#xff1a;“本周的选题”&#xff0c;随后&#xff0c;屏幕上的工具调用记录一行行滚过&#xff1a;分析账号定位、生成检索条件、搜索近期内容、排出候选题。我们选定一个&#xff0c;它又去补资料、搭大纲、写初稿……这不是一次简单的模型问答&…

作者头像 李华
网站建设 2026/10/30 12:52:38

【计算机毕业设计单片机案例】基于STM32的婴儿监护环境调节与摇篮哄睡系统设计 基于物联网的智能婴儿床环境调节与生理状态监测装置设计(032707)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华