前面学习Hibernate时,说到Hibernate映射,方法有两种:注解和映射文件。各有利弊:就灵活性而言,映射文件的方式肯定更优,且分类管理更容易;而注解的优势在于容易理解,不用专门再写映射文件。
现在引出问题,一些思维定势:类似注解和映射文件,我们总是习惯将它们分开来看,为什么两条路就要分开走?即既然各有优劣,为什么不合并到一起取长补短?当初学时,确有疑问:注解的方式程序既然能理解,为什么不自动生成映射文件?
Ant是构建工具,什么是构建工具?在我看来,就是做一些辅助工作的,例如:编译、打包、测试、执行等。我觉得这个工具最好的优点是:可定制,也就是说你给它一个XML文件(build.xml或另定),指定工作内容和流程,然后它照章执行。
XDoclet和注解像,但又不一样:同于都是以注释的方式卸载属性前,供程序解析;不同于根据解析的注释,配合Ant,可以生成相对应的文件——这不是上面说的注解和映射文件的合并么!
注意虽然在此处以Hibernate映射文件为例,它可不是只能生成Hibernate的映射文件,Struts、源码、web样样精通。不过它不是独立的程序,需要依赖于Ant。
/** * * @author Administrator * @hibernate.class table="T_Orgnization" */ public class Organization { /** * @hibernate.id * generator-class="native" */ private int id; /** * @hibernate.property */ private String name; /** * @hibernate.property */ private String sn; /** * @hibernate.property */ private String description; /** * @hibernate.many-to-one * column="pid" */ private Orgnization parent; /** * @hibernate.set inverse="true" lazy="extra" * @hibernate.key column="pid" * @hibernate.one-to-many class="com.tgb.oa.model.Orgnization" */ private Set children; //此处省略getter和setter }
给Ant指定执行内容和流程的配置文件。
<?xml version="1.0" encoding="GBK"?> <project name="系统构建脚本" default="生成映射文件" basedir="."> <property name="src.dir" value="${basedir}/src"/> <property name="xdoclet.home" value="D:\Program Files (x86)\xdoclet-plugins-1.0.3"/> <!-- Build classpath --> <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="生成映射文件"> <xdoclet> <fileset dir="${src.dir}/com/tgb/oa/model"> <include name="**/*.java"/> </fileset> <component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" version="3.0" destdir="${src.dir}" /> </xdoclet> </target> </project>
来分析一下这个配置文件
Ant根据build.xml,生成的Hibernate映射文件如下:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class table="T_Orgnization" name="com.tgb.oa.model.Orgnization"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <property name="sn"/> <property name="description"/> <many-to-one column="pid" name="parent"/> <set name="children" inverse="true" lazy="extra"> <key column="pid"/> <one-to-many class="com.tgb.oa.model.Orgnization"/> </set> </class> </hibernate-mapping>
我觉得学习使用工具不难,难的是能不能找到共性进而升华,例如从SSH的学习开始,解耦合用的一直是xml文件,如果开发中碰到解耦合的问题能不能想到xml?
另外,工具的学习,也很重要的是,能不能知其然,再知其所以然:如果没有Ant及类似的工具,你会不会去开发一个类似的工具?不要一直跟随别人,你也可以做个领路人。