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>

代码生成框架保留变量

转至元数据结尾

转至元数据起始

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

界面定义规范

本节详细介绍,上一节中提高的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>

表格一:属性介绍:


 

表格二:控件介绍:


示例模板编写

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

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

时间: 2024-08-29 09:18:53

Tiny代码生成框架的相关文章

Tiny分布式计算框架开源了

源码地址: http://git.oschina.net/tinyframework/tiny http://git.oschina.net/tinyframework/tiny/tree/master/framework/org.tinygroup.pc 前面和果粉们说了,要在200果粉齐了的时候就开源分布式计算框架,在偶死皮赖脸的乞讨声中,终于够200了,没啥好说滴,开吧. 先说说我当时做分布式计算框架的背景故事,本来开始时我是需要一个分布式计算框架的,但是读了fourinone之后,我觉得

Tiny并行计算框架之实现机理

当然,秉承偶的一向的观点,让新手也能看得懂. 首先看工作的接口: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 public interface Wor

Tiny并行计算框架之复杂示例

问题来源 非常感谢@doctorwho的问题: 假如职业介绍所来了一批生产汽车的工作,假设生产一辆汽车任务是这样的:搭好底盘.拧4个轮胎.安装发动机.安装4个座椅.再装4个车门.最后安装顶棚.之间有的任务是可以并行计算的(比如拧4个轮胎,安装发动机和安装座椅),有的任务有前置任务(比如先装好座椅,才能装车门和顶棚).让两组包工头组织两种类型的工作:将工人分成两种类型,即可并行计算的放在同一组内,由职业介绍所来控制A组包工头做完的任务交给B组包工头.中间环节的半成品保存到Warehouse中,是这

20个代码生成框架

1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.codesmithtools.com/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单.好用.所有api可以在帮助菜单中找到. 官方网站:http://www

20个代码生成框架 (.NET JAVA)

1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.codesmithtools.com/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单.好用.所有api可以在帮助菜单中找到. 官方网站:http://www

构建Tiny生态圈

生态圈 生态圈又称商业生态圈,指商业活动的各利益相关者通过共同建立一个价值平台.各个角色关注其所在的价值平台的整体特性,通过平台撬动其它参与者的能力,使这一系统能够创造价值,并从中分享利益. 一个好的架构,必须构建一个围绕平台的生态系统,或者流行的说法,叫生态圈.因为再好的系统,如果只是做输出,总是会有这样那样不足的地方,Spring提供了一个依赖注入,实际上就是创建了一个Bean的生态圈,所以Spring的应用推广效果就非常好:Maven构建了一个插件生态圈和资产生态圈,所以,通过插件生态圈,

Tiny开发框架PPT介绍

我有一个梦想,那就是那一个NB的开发框架,让使用它的企业成本下降,让使用它的软件工程师轻松快乐.有人问我,你觉得smart框架与Tiny相比怎么样?我的回答是:smart是一个非常棒的框架.有人把JFinal的特性贴出来问我,你觉得Tiny框架与JFinal比怎么样?我的回答是:JFinal是一个非常出色的框架.不同的框架有不同的目标定位,有不同的目标群体,只要是使有者觉得不错,那就是合适的,就是好的.也有人非让我把Tiny框架和其它开源框架比较到底差异在哪里?这个问题确实不太好回答,于是我回答

类加载器特技:OSGi代码生成

我们将按照复杂性增加的顺序考察一些类加载的典型问题,开发一小段代码 来解决这些问题中最有趣的一个.即使你不打算马上写一个代码生成框架,这篇 文章也会让你对静态定义依赖的模块运行时(如OSGi系统)的低级操作有比较深 入的了解. 这篇文章还包括一个可以工作的演示项目,该项目不仅包含这里演示的代码 ,还有两个基于ASM的代码生成器可供实践. 类加载地点转换 把一个框架移植到OSGi系统通常需要把框架按照extender模式重构.这个模 式允许框架把所有的类加载工作委托给OSGi框架,与此同时保留对应

Tiny快速入门之控制层开发

一.通过代码编写控制层逻辑 1.代码示例 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Controller() public class HelloAction implements WebContextAware{       private WebContext webContext;           public void setContext(WebContext webContext) {         this.webC