Tiny代码生成框架

概述:

我们经常会碰到这种情况,就是许多时候有些代码或配置都长得很像,或者说他们就好象一个模子里拓出来的一样,只是其中有一部分的内容不同而已。那么,如果我们能找得到其中的一些规律,是不是就可以通过工具自动生成??这样不就可以提升开发效率,避免人为错误。

因此,我们就对这种处理进行抽象,构建了一个代码生成框架,用于生成各种文本类型的内容,比如:代码,配置等。

在整个代码生顾体系中,有三种角色需要参与:

Tiny代码生成框架

Tiny代码生成框架与Maven的骨架程序有哪些异同呢?

  • 两者都可以用来快速创建项目的骨架程序
  • Maven所有的参数都需要通过手工录入,Tiny代码生成框架则提供了可视的界面来进行参数录入,人机界面更好
  • Tiny代码生成框架可以在当前工程中增量式添加内容,而Maven的骨架生成,则只能用来创建初始工程。
  • Maven的骨架程序只能与Maven工程相结合,而TIny代码生成框架则与Maven无关。

代码生成模板编写者需要对业务开发熟熟练掌握,对模板语言有简单了解,有一定的模式抽象能力。

代码生成模板编写者,需要对Velocity模板语言有一定的了解。

代码生成框架的设计目标:

  • 可以生成各种文本类型的代码、配置等文件
  • 可以一次生成多个文件
  • 有相当高的可定制性,也就是业务部门可以根据自己的要求自行归纳总结,并定义自己的代码生成模板
  • 工具的统一性,工具一次开发好,不论以后有多少种代码生成需求,都应该是稳定的,除非代码生成框架的规范进行升级。
  • 界面的高可定制性,不同的业务代码生成模板,可以定制自己的数据采集界面,框架负责生成界面并收集数据

代码生成元数据规范


代码生成元数据文件是代码生成框架的核心文件,该文件内容包含了以下信息:

  • 定义代码生成基本信息
  • 指定eclipse界面定义文件的路径
  • 配置一系列根据模板文件生成代码的模板定义信息。
  • 引用的宏函数文件(可选)

以下是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>


Tiny代码生成框架

转至元数据结尾
转至元数据起始

在代码生成框架中,框架内部有一些保留变量,这些变量会在代码生成元数据中或模板文件中引用,用于处理生成的文件名或文件内容。

Tiny代码生成框架

界面定义规范


本节详细介绍,上一节中提高的UI定义文件(ui-define-file属性),此属性指定对应的UI配置文件

我们约定文件名: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配置文件样例
<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>

表格一:属性介绍:

Tiny代码生成框架

 

表格二:控件介绍:

Tiny代码生成框架

示例模板编写

元数据文件可以引用两种类型的模板文件:

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文件示例:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-autowire="byName" default-lazy-init="true">
<bean id="$stringUtil.toCamelCase($className)" scope="prototype"
      class="$beanPackageName.$className">
</bean>
</beans> 

所谓模板文件,就是把原来的文件复制过来,把一些原来静态的内容用占位符及一个模板语句控制语句替换之后形成的。

实际使用

Tiny代码生成框架

Tiny代码生成框架 

  Tiny代码生成框架Tiny代码生成框架

总结

Tiny代码生成工具,在实际应用当中,还是非常易用的。它把参与者分成:框架构建者,模板构建者,最终使用者。由于角色分明,所以各个参与者都做自己擅长做的事情,可以大大提高开发效率,避免一些低级错误的发生。