文档章节

Tiny代码生成框架

悠悠然然
 悠悠然然
发布于 2014/06/22 11:05
字数 1493
阅读 895
收藏 1
点赞 1
评论 0

概述:

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

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

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

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

© 著作权归作者所有

共有 人打赏支持
悠悠然然

悠悠然然

粉丝 2365
博文 173
码字总数 360373
作品 14
杭州
架构师
Tiny快速入门之控制层开发

下面是一些常用的链接,供大家使用: GIT地址(必须是OSC家的):https://git.oschina.net/tinyframework/tiny 问题报告:https://git.oschina.net/tinyframework/tiny/issues 官方网站:http:...

悠悠然然 ⋅ 2014/11/27 ⋅ 8

TinyFramework 2.0 火热推出,J2EE 应用开发框架

Tiny 框架历经一年的开发,提交数千个 Commits,终于可以发布 2.0 了。 2.0版本较1.0版本,有太多太多的提升,有许许多多解决了有无的问题,因此,也可以看成是一个有显著提升的版本。 Issu...

悠悠然然 ⋅ 2015/06/10 ⋅ 71

悠然乱弹:云里雾里说Tiny

今天从杭州到重庆,登机时间晚了20分钟,又晚了20分钟,又晚了20分钟,尼玛,这和我们软件实现的进度有得一比,总是他妈的延迟、延迟再延迟。 终于登机了,可能是MH17的事情影响了我的心情,...

悠悠然然 ⋅ 2014/07/20 ⋅ 9

文档生成框架

序言 Word文档生成在许多项目中都是需要的,目前来看有两种方案,一种是通过Apache POI工具包、iText来生成,另外一种是利用Office Open Xml规范来进行生成。各种方案各有优缺点,这里不对其...

悠悠然然 ⋅ 2013/12/22 ⋅ 4

Word文档生成--TinyDocGen

序言 Word文档生成在许多项目中都是需要的,目前来看有两种方案,一种是通过Apache POI工具包、iText来生成,另外一种是利用Office Open Xml规范来进行生成。各种方案各有优缺点,这里不对其...

悠悠然然 ⋅ 2014/03/07 ⋅ 1

Tiny模板引擎--TinyTemplate

Tiny模板引擎 是一个基于Java技术构建的模板引擎,它具有体量小、性能高和扩展易的特点。 适合于所有通过文本模板生成文本类型内容的场景,如:XML、源文件、HTML等等,可以说,它的出现就是...

悠悠然然 ⋅ 2014/06/18 ⋅ 1

Tiny开发框架PPT介绍

我有一个梦想,那就是那一个NB的开发框架,让使用它的企业成本下降,让使用它的软件工程师轻松快乐。 有人问我,你觉得smart框架与Tiny相比怎么样?我的回答是:smart是一个非常棒的框架。 ...

悠悠然然 ⋅ 2014/11/21 ⋅ 76

Tiny1.2.0预览版全面开源

感谢 感谢OSChina为我们提供了这么好的共享与交流平台。 感谢红薯及OSChina管理团队所有打过没打过交道同仁对Tiny一直以来的支持与帮助。 感谢所有鼓励和批评我的同学们,鼓励者为我们添加勇...

悠悠然然 ⋅ 2014/11/28 ⋅ 33

Tiny微信框架是怎样设计的?

微信对国人而言,想必大名鼎鼎,活跃用户数已经突破6.5亿,足以说明这款应用的生命力。但是使用人数众多,不代表微信的API设计优异,有过微信公众号开发经验的人,想必复杂的报文,众多的服务...

悠悠然然 ⋅ 2016/05/10 ⋅ 22

Tiny快速入门之服务开发

周五发了Tiny框架即将全面开源一文,有不少同学给了不少有意义的意见和建议,其中一条就是感觉太虚了,期望来点实的,因此本文将从实打实的快速开发方面讲起,来说明一下用Tiny框架开发一些业...

悠悠然然 ⋅ 2014/11/23 ⋅ 12

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 30分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 32分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 37分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 40分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 43分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 44分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 47分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 50分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 50分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 51分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部