XDoclet是一个通用的代码生成实用程序,是一个扩展的Javadoc Doclet引擎。它允许您 使用像JavaDoc标记之类的东西来向诸如类、方法和字段之类的语言特征添加元数据。随后,它利用这些额外的元数据来生成诸如部署描述符和源代码之类的相关文件。
XDoclet继承了JavaDoc引擎的思想,允许根据定制JavaDoc标记生成代码和其它文件。当然,XDoclet也可以访问整个解析树,这样,它就可以访问类、类的包结构和类的方法。开放源代码的XDoclet代码生成引擎,是许多先进的Java框架不可缺少的组成部分,常常被用作面向属性编程和持续集成的引擎。XDoclet能够很容易成为您的Java编程工具箱中的一个更加通用的跨技术代码生成工具。
上面提到了面向属性编程(Attribute-Oriented Programming),之前还提到了面向切面的编程(Aspect-Oriented Programming),二者的缩写都是AOP。但二者是不相等的。关于面向属性编程,不论你找度娘还是谷哥,几乎找不到中文资料,就是Attribute-Oriented Programming!=Aspect-Oriented Programming也是搜到了一个英文的资料才知道的。
而全英文的一本书讲解Attribute-Oriented Programming我搜到了一本书,是2010年的,可见我们所了解到的知识是多么的落后,在此,也呼吁大家好好学习英语,英语太重要了!!!
关于XDoclet的学习,我只是通过使用XDoclet生成Hibernate映射和配置文件找了一下规律。
XDoclet使用起来其实不难,我通过下面例子来大概总结一下:
<?xml version="1.0" encoding="GBK"?>
<project name="OA系统构建脚本" default="生成Hibernate配置文件" basedir=".">
<!-- 定义一些变量来保存路径路径 -->
<property name="src.dir" value="${basedir}/src"/>
<property name="build.dir" value="${basedir}/bin"/>
<property name="webapp.dir" value="${basedir}/src/webapp"/>
<property name="xdoclet.home" value="D:/xdoclet-plugins-1.0.3"/>
<!-- 引用xdoclet的包 -->
<path id="xdoclet.task.classpath">
<fileset dir="${xdoclet.home}/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${xdoclet.home}/plugins">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath"/>
<target name="生成Hibernate配置文件">
<xdoclet>
<!-- 指定路径 -->
<fileset dir="${src.dir}/com/jianxin/oa/model">
<include name="**/*.java"/>
</fileset>
<!-- 指定工具类,并配置配置文件都要生成什么 -->
<component
classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
destdir="${src.dir}"
version="3.0"
hbm2ddlauto="update"
jdbcurl="jdbc:mysql://localhost:3306/oa"
jdbcdriver="com.mysql.jdbc.Driver"
jdbcusername="root"
jdbcpassword="admin"
dialect="org.hibernate.dialect.MySQLDialect"
showsql="true"
/>
</xdoclet>
</target>
<target name="生成hibernate映射文件">
<xdoclet>
<!-- 指定路径 -->
<fileset dir="${src.dir}/com/jianxin/oa/model">
<include name="**/*.java"/>
</fileset>
<!-- 指定工具类 -->
<component
classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
version="3.0"
destdir="${src.dir}"
/>
</xdoclet>
</target>
</project>
在配置的过程中,可以看下官网给的文档,对component中都需要配置什么都进行了说明。那么现在就来看一下实体类要怎么样编写,才能够通过XDoclet生成配置文件。
要想生成Hibernate的映射文件,那么映射文件中应该有的东西,在写JavaDoc的时候,是都需要写进去的,而且很相似。
通过一个简单的例子来看吧:
实体类文件:
/**
* 公文
* @hibernate.class table="t_document"
*
*/
public class Document {
/**
* @hibernate.id generator-class="native"
*/
private int id;
/**
* 标题
* @hibernate.property
*/
private String title;
/**
* 创建者
* @hibernate.many-to-one column="userId"
*/
private User creator;
}
生成的映射文件:
<hibernate-mapping>
<class table="t_document" name="com.jianxin.oa.model.Document">
<id name="id">
<generator class="native"/>
</id>
<property name="title"/>
<many-to-one column="userId" name="creator"/>
</class>
</hibernate-mapping>
通过对比编写的类和生成的配置文件,不难发现:
1、name不指定,就是使用的变量名
2、@hibernate.标签 属性=“值”,生成的配置文件是<标签 属性=“值”>
3、当有多个属性时,只需要用空格分开即可
这样,就不用再多学习一个东西了,我们如果熟悉了hibernate的映射文件的编写,那么你在知道了这个规律后,轻轻松松的就可以熟悉XDoclet的JavaDoc的编写。
现在再来看使用XDoclet的好处,它减少了我们的工作量了么?
我觉得没有,有些人甚至还会说它在某方面还增加了我们的工作量,因为在有些地方,它和hibernate中的对应还是有不一致的地方,我们不得不用时间去查。
但是它的出现,使得你不需要再在类和配置文件之间切换,只需要通过类的编写,然后就可以写成类和配置文件的一致性。
对于XDoclet的使用,应该就像使用资源管理器创建表和使用脚本创建表的区别是一样一样的:
不论使用哪种方式,表名、列名、类型这些都需要写,但使用脚本时,不需要一起移动鼠标、不需要找东西,因为成竹在胸,所以会提高效率。如果你不会使用脚本,那么资源管理器是你的好选择。
而手动写映射文件和使用XDoclet不也是这样么?
标签、属性、值都需要你写,但不一样的是你在编写类的时候就对这些写完了,还是那句话,成竹在胸。但如果你对映射文件的编写不熟悉,只知道大概是什么标签,那么使用XDoclet还是很乏力的。
XDoclet不只有Hibernate的插件,还有很多,更多插件等待着你来使用,如果发现上面对于XDoclet的学习和使用有什么纰漏,欢迎斧正~