本文共 3672 字,大约阅读时间需要 12 分钟。
我们经常会碰到这种情况,就是许多时候有些代码或配置都长得很像,或者说他们就好象一个模子里拓出来的一样,只是其中有一部分的内容不同而已。那么,如果我们能找得到其中的一些规律,是不是就可以通过工具自动生成??这样不就可以提升开发效率,避免人为错误。
因此,我们就对这种处理进行抽象,构建了一个代码生成框架,用于生成各种文本类型的内容,比如:代码,配置等。
在整个代码生顾体系中,有三种角色需要参与:
代码生成模板编写者需要对业务开发熟熟练掌握,对模板语言有简单了解,有一定的模式抽象能力。
代码生成模板编写者,需要对Velocity模板语言有一定的了解。
以下是HelloWorld代码生成的元数据文件:
<code-gen-metadata category="javacode" icon="" name="codegen" title="java代码生成" ui-define-file="/helloworld.ui.xml"> <description>java代码生成的元数据文件</description> <template-define template-path="/helloworld.javapage" file-name-template="${JAVA_TEST_ROOT}$codeGenUtil.packageToPath($beanPackageName)${className}.java"> </template-define> <template-define template-path="/helloworld.beanpage" file-name-template="${JAVA_TEST_ROOT}${templateFilePath}${templateFileName}.xml"> </template-define> <macro-define macro-path="/helloworld.marcopage" /> </code-gen-metadata> |
在代码生成框架中,框架内部有一些保留变量,这些变量会在代码生成元数据中或模板文件中引用,用于处理生成的文件名或文件内容。
我们约定文件名:xxx.codegenui.xml
下面看一段示例配置,一一介绍系统内的所有控件。
<code-gen-metadata category="javacode" icon="" name="codegen" title="java代码生成" description="java代码生成的元数据文件" ui-define-file="/text.codegenui.xml"> <template-define template-path="/helloworld.javapage" file-name-template="${JAVA_TEST_ROOT}$codeGenUtil.packageToPath($beanPackageName)${className}.java"> </template-define> </code-gen-metadata> |
<ui columns-per-line="5"> <group title="分组1"> <!-- 可选类型text ,textarea, combo , checkbox ,openType, space--> <control name="a" title="文本框" type="text" default-value="" columns="5" required="true"/> <control name="b" title="大文本框" type="bigtext" default-value="" columns="2" required="true"/> <control name="c" title="单选框" type="checkbox" default-value="" columns="2" required="true"/> <control name="d" title="查找类" type="openType" default-value="" columns="3" required="true"> <ext-config><![CDATA[ <!-- 文件模式和java类模式不能同时存在,如果不配置,则默认java类模式 --> <file-type>*.xml</file-type> <!-- <java-type>java.lang.Exception</java-type> --> ]]></ext-config> </control> <control name="e" title="空白填充物" type="space" default-value="" /> <control name="f" title="用户" type="combo" default-value="001" required="true"> <ext-config><![CDATA[ <items> <item key="刘二" value="001"/> <item key="张三" value="002"/> <item key="李四" value="003"/> <item key="王五" value="004"/> <item key="赵六" value="005"/> <item key="严七" value="006"/> </items> ]]></ext-config> </control> </group> </ui> |
表格一:属性介绍:
表格二:控件介绍:
元数据文件可以引用两种类型的模板文件:
1、宏模板文件:使用macro指令把一段模板代码块定义为宏,可以被多个模板文件引用。
定义示例:
#macro(sayHello $type $name) public String sayHello($type $name){ if($name==null){ $name="haha"; } return "hello"+$name; }#end |
调用示例:
#sayHello("String" "name") |
2、模板文件:模板文件可以是任意的文本文件,里面可以包含模板语言的标记:
Java代码示例:
package $beanPackageName;import java.io.Serializable;public class $className implements Serializable{ #sayHello("String" "name")} |
Xml文件示例:
所谓模板文件,就是把原来的文件复制过来,把一些原来静态的内容用占位符及一个模板语句控制语句替换之后形成的。
Tiny代码生成工具,在实际应用当中,还是非常易用的。它把参与者分成:框架构建者,模板构建者,最终使用者。由于角色分明,所以各个参与者都做自己擅长做的事情,可以大大提高开发效率,避免一些低级错误的发生。
转载地址:http://scesa.baihongyu.com/