一、背景
codeMaker的V3预览版已经往组件化方向迈进了一步,但是仍然有一些需求和细节没有完成,因此本版本将是整个V3版本的最终特性发布内容,完全的释放codeMaker平台的一些配置能力和二次开发的潜力。另外一方面也将通过这个版本来补全整个Java微服务生态后端代码生成的全流程。
二、需求
2.1 发布节奏
本次发布内容没有给自己特别的压力去赶工期进度,因为一方面用户在使用本项目过程中确实遇到了一些问题,这些问题也影响了开发体验,所以在这个版本中定了一个目标:生成即可运行。在实现上很多相关问题都必须得到解决,虽然确实需要修改一些配置才能启动,但是在代码上是不希望存在一些编译时异常的。因而为了让codeMaker发挥最大的价值,本次发布的版本节奏实际上已经超过了1个月。当然,经过一些推广天画整体项目的知名度上了一个档次。
2.2 特性列表
-
在动态调用时序中增加一些细化的逻辑控制 -
支持可配置的多种参数校验代码逻辑生成的策略服务 -
支持在plantuml领域文档中增加方法注解并解析生成到项目代码里 -
降低对数据库链接的强依赖,以数据库e-r图或者excel表作为数据库元数据信息的来源 -
自定义代码元素模板/片段,并融入到代码生成流程中 -
对配置文件模板化并生成到项目里 -
将数据库sql文件复制到项目工程里 -
将plantUML领域文档和调用时序文档复制到项目工程里 -
打通语雀等api文档管理软件 -
管理pom依赖,支持pom.xml文件生成 -
扩展plantUML生成代码时允许依赖外部代码类 -
选择最少一个组件作为二次开发的案例融入到代码生成流程中,并作为组件市场接入代码生成的典型案例 -
所有模式皆可达到生成即可运行的水平。
2.3 重构
-
重构不同应用下的代码生成逻辑,减少代码量以支持自定义代码元素和模板来融入到代码生成中 -
重构WriteCodeService相关的代码元素写服务,降低整体代码生成流程的复杂度
总体上降低样板类代码方法,提高可维护性,降低代码复杂度。另外也要保证不同模式下的代码生成不会受到影响。
三、设计与实现
3.1 整体架构
这是本次V3版本的架构图,整体上跟V3预览版本差别不大,但是仍然加入了很多新的内容,这里进行简单的解读一下:
3.2 二次开发
这里将一些公共的代码生成业务模型和一些顶层接口都挪到了codeMaker-api模块里,对应的二次开发实现和默认实现都在codeMaker-apiImpl模块中。这里可以帮助用户定制基于自己公司技术栈的代码元素生成,享受codeMaker的通用能力。
3.2.1 mybatis-plus组件接入
很多项目中也用到了mybatis-plus组件,来提高开发效率,这里我也专门通过codeMaker的二次开发能力亲自将mybatis-plus接入到代码生成流程中。相当于做了一个组件的适配。
3.2.2 liteflow组件接入
liteflow是我关注的另外一个社区中的项目,在引入的过程中针对liteflow的一些类做了特定的识别和包装,因此对于liteflow中识别出了两个新的代码元素一个是SlotBO,一个是Cmp。所以借助二次开发的能力实现对plantUML领域模型文档中出现的SlotBO和Cmp做特定的装饰,让其继承liteflow里的基类,当然还有另外一种方式就是通过自定义代码元素freemarker模板来解决组件接入的问题。如下是二次开发内容相关的代码类图:
3.3 基于全文档模式的代码生成
你可以理解为这是一种全新的代码生成模式,就是说可以用数据库e-r图plantUML 文档或者excel文档当作数据模型,不再强行依赖目标项目的数据库,此时依然可以生成完善的代码工程内容。
3.4 多种参数校验逻辑生成
在之前维护的一些平台类系统中,见识了很多参数校验实现的写法和方案,这里我主要参考了5种不太相同的参数校验逻辑,将其融入代码生成中,让接口层基本的参数校验逻辑也可以通过codeMaker构建出来。如下是实现相关的类图:
3.5 pom依赖和配置项接入
因为已经做了组件化,那么就要让相关的组件信息导入到项目里,在Java maven项目中,这里让组件的maven GAV 信息通过配置导入的各个项目子模块中。
在架构图的右侧组件市场中,不同级别的组件有些有默认配置,有些没有。所以codeMaker也提供了不同组件的配置项内容模板文件,与组件的配置说明文件一起,在需要的时候引入即可让组件的配置融入到项目的配置文件中。
3.6 自定义注解接入
自定义注解的实现是比较个性化的,而且也是相对实用的功能,代码生成出来有些类或者方法都需要一些统一的注解,所以这里为了实现通用的逻辑,在plantUML 领域模型文档中对类和方法做了一些标记,在解析的时候动态解析配置的自定义注解信息即可让相关注解生成到项目代码中。
3.7 自定义代码元素接入
这一版本发布的内容有了很多自定义配置相关的内容,最大的一个特性就是可以自定义代码元素模版,走自定义freemarker代码元素模板可以降低很多定制化的代码生成逻辑,同时与codeMaker本身提供的30多种代码元素相互配合,进一步降低手动写代码的工作量。
3.8 JavsScript脚本项目接入
这里需要重点提一下,当然不了解的可以忽略。简单介绍一下JavsScript,你可以认为JavsScript就是JavaScript,算是一种基于Java语法特性的业务脚本语言,后续我会专门用系列文章来介绍JavsScript的详细内容和Javs引擎相关的技术实现。
四、使用流程
4.1 配置内容说明
V3版本在配置上也做了一些增量变更这里,简单说明一下:
4.1.1 application.properties配置内容
#是否链接目标数据库,默认是,不链接则需要在resources/er-plantuml文件夹下创建对应项目应用的plantuml e-r图文档,
#内部融合了codemaker-dberparse模块的功能可以解析并实现不链接具体应用的数据库而实现代码生成
application.global.linkdb=true
#application.global.linkdb=false
#是否启用javs脚本来辅助代码生成,默认false
application.javsscript.enable=false
4.1.2 projecttemplate-cola.properties配置内容
这里以cola应用模式举例,增加了一些新的配置项
#应用别名与目标工程输出目录一致
cola.global.applicationNameAlias=express
#这里配置一个顶级的绝对目录,生成的代码会根据项目名构建代码工程路径,与codeMaker-parent同一路径
cola.code.app.project.path=/Users/shenshuai/scworkspace/myspace/code-maker
#目标工程输出目录,这里填写对应的工程的绝对路径
#以下配置项已过期
#cola.code.outpath.cola-adapter=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-adapter
#cola.code.outpath.cola-infrast=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-infrast
#cola.code.outpath.cola-app=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-app
#cola.code.outpath.cola-domain=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-domain
#cola.code.outpath.cola-client=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-client
#cola.code.outpath.cola-start=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-start
#cola.code.outpath.cola-feign-api=/Users/shenshuai/myspace/code-maker/codemaker-cola/cola-feign-api
#是否将调用时序文档同步到项目工程里,默认同步
cola.plantumldoc.sync=true
#应用级代码参数dto,vo所需要的参数验证逻辑构建bean,内置五种实现
#支持validateAopService,validateJSRHibernateService,validateParamService,validateUtilService,validateServiceValidator
# 这里可以配置两个一起使用,也可以配置一个单独使用
cola.component.validate.beans=validateParamService,validateServiceValidator
#代码工具类注册,项目初始化时可以帮助初始化对应的工具类
#后面生成代码的时候可以删掉工具类,只专注于生成业务代码
#格式说明 eg:BaseEvent:core 前面是需要初始化的类,后面是这个类放到哪个模块下
cola.component.init.clazz=BaseEvent:domain,Application:start,BaseController:adapter,PageBO:domain,SpringApplicationContext:domain,AppEventPublisher:domain,LockA:domain,MqHandler:domain,IdemPotent:domain
#项目各个模块需要依赖的pom gav配置
cola.component.init.pom=apiresult:adapter,apiresult:client,hutool-core:app,hutool-core:adapter,apiresult:feignapi,mybatis-plus:infrast,liteflow:domain,rocketmq:infrast,springboot-redis:infrast
#自定义ftl代码元素,eg 自定义freemaker模板文件名:文件类型:所属模块标示。ftlFileName:classType:moduleName
cola.code.template.custom.ftl=validator:class:app,cmp:class:app
#项目各个模块需要导入的配置文件,配置说明: 文件名_文件扩展名:所属模块标示
cola.component.init.config=application_properties:start,log4j_properties:start,mybatis-config_xml:infrast,liteflow_properties:start
4.2 全文档模式的代码生成流程

4.3 自定义注解使用流程

4.4 自定义代码元素模版使用流程

4.5 组件配置注册流程
上一版本基本实现了组件自身的MAVEN-GAV的配置接入,以及相关的核心代码被生成流程引用,但是实际过程中有些组件是属于一个技术栈的,有些组件是需要带配置的,所以这一期内容则是相对完整的解决这个问题,为了能达成生成即可运行的目的,所以需要把组件的配置项内容同步生成到对应的代码工程里,整体使用流程如下:
4.6 JavsScript应用模式使用流程
JavsScript应用模式算是codeMaker低代码借助Javs引擎而进行增强的一种低代码生成模式,当然如果觉得麻烦或者鸡肋的话可以通过配置关闭这种模式。这里也简单介绍一下生成流程,可能会比其他模式显得有点麻烦:

五、总结
本次发布内容将一些历史遗留的ISSUE解决,另外也对整个组件市场与低代码的融合做了深度开发,在Java方面不论微服务还是大型单体项目都可以通过文档来构建,这与本项目一直遵守的理念是相符的。构建的文档可以帮助产生有效代码,同时与项目一体交付则更能形成整个工程代码内容的完整闭环。
在整个重构过程中,对于架构和未来演进的方向也变得更加清晰,对于曾经的架构决策有过怀疑和动摇,看上去经历了很多个版本才达到一个相对理想的结果。实际上走过的弯路回头看的话,重走可能也不会一步到位的实现这样的结果。这也正是我的目的–锻炼系统架构落地能力。
另外,很多网友也提出了一些新的需求,比如弄个网站可以演示一波。在前端代码生成方面也在计划实现,包括基于低代码来实现codeMaker的web化,所以未来还有一些迭代内容。
原文始发于微信公众号(神帅的架构实战):天画-codeMaker组件V3版本设计与实现
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/241492.html