最近比较厌烦维护程序里一票的实体bean,希望可以通过某种比较灵活的手段,动态从xml文件生成bean。相信我也不是第一个有这种想法的人,在这请教一下谁有比较好的实现这个目的的方法。   先具体说下我想实现的功能,一个bean只要对应一个简单的xml文件(如果用到dtd或是schema的话就太繁琐了),这个xml文件相当于这个bean的模板,通过解析这个xml文件就可以动态生成bean。我初步考虑实现起来应该不会很困难,在xml文件中保存这个bean的属性信息,解析后把所有属性都add进BeanUtils的DynaBean中就可以了。   现在的疑问就是这个xml文件应该以怎样的格式来保存bean的属性,才可以比较方便解析和扩展;还有用什么样的方式去解析xml文件比较合理呢?
   我现在想到的有个比较粗陋的方法,就是把属性抽象成一个对象来保存属性的名称和默认值
public class MetaData{
 public String name;
 public String value;
}
xml文件中保存MetaData对象的list,通过betwixt来读取,并将其中的属性及默认值set进DynaBean中。这个原始的DynaBean就是模板,程序中用到这个bean的时候,就通过clone这个模板bean来获得。   自我感觉这样做也挺麻烦的,而且限定了bean的属性只能为String,离理想的目标还有很大距离。希望大家可以提供一些更为方便灵活的从xml生成bean的方法和思路。谢谢

解决方案 »

  1.   

    看看spring 吧.呵呵
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
        <description>Spring Quick Start</description>
        <bean id="mailToList" class="spring.DataInfo">       
            <property name="mailList">
                <list>
                    <value>tt|[email protected]</value>
                </list>
            </property>                
        </bean>    
    </beans>
    ================
    package spring;import java.util.ArrayList;public class DataInfo {
    ArrayList mailList ; public ArrayList getMailList() {
    return mailList;
    } public void setMailList(ArrayList mailList) {
    this.mailList = mailList;
    }
    }
    ==================
    package spring;import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringTest { /**
     * @param args
     */
    public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml") ;
    DataInfo mailList = (DataInfo)ctx.getBean("mailToList") ;
    String str[] = new String[mailList.getMailList().size()] ;
    mailList.getMailList().toArray(str) ;
    for(int i=0;i<str.length;i++)
    {
    System.out.println(str[i]) ;
    }
    }
    }
    =========
      

  2.   

    to addjava:
        我是不想写DataInfo这个类,想达到通过xml直接动态生成bean的目的
    to zdsdiablo:
        用映射的话还是要自己把这个bean写出来,当需要的bean的种类很多的时候还是很麻烦。比方说我的系统里用到很多种不同格式的文本文件,我不想对每种文件格式都写个对应的bean,而是想通过定义一个xml模板来动态的生成
      

  3.   

    hibernate 有个工具,
    可以 sql 语句,xml文档,java 类三者任意转换...
    不过xml生成的java类中 方法只有 get 和 set .其它方法要自己写..
      

  4.   

    > 我是不想写DataInfo这个类,想达到通过xml直接动态生成bean的目的所谓的 bean,是一个 object instance,它终归要有一个 Class 做基础。
    如果我没理解错,你是不想在 design-time 写这样一个 Class 的,那么就一定要在 run-time 搞一个 Class 出来。据说 CGLib 可以做这样的事情。
      

  5.   


       hibernate 那个工具还是把这个class的代码给生成出来了,并不是说动态生成的,我的意思是我不需要先Bean的Class,而是想在程序运行时动态创建DynaBean对象,在这个dynaBean会把xml文件中描述的属性加进去,我所有的bean都是DynaBean,是基于反射机制创建的,没有design-time 的Class。   在网上查了不少时间,很少有关于这方面的描述,只看到commons的betwixt的task有打算实现这样的功能:
       Add dynabeans support. Dynabeans are a feature of commons-beanutils that allows data in non-beans to be wrapped into pseudo-beans. If betwixt supported dynabeans then you could do cool stuff like SQL -> DynaBeans -> XML. Probably a good way to do this would be to ensure that all property introspection is done by dyanbeans-aware methods of beanutils.http://jakarta.apache.org/commons/betwixt/tasks.html
      

  6.   

    直接从XML到Bean的映射似乎不好解决数据类型的问题。如果是定义一个schema倒是可以利用XMLSpy的工具很容易的导出java代码。我现在就是用XMLSpy2006(试用版)定义Schema,然后导出java数据类,方法很全。
      

  7.   

    spring就是通过xml组装对象和定义对象依赖关系的
      

  8.   

    to ylssww(斯斯文文):
      我本来也考虑过用xmlspy或是XMLBeans,但还是觉得复杂了,而且作用不大。因为用这两种方法的话都是要预先生成java类的代码的,有什么改动的话还要重新生成代码,再打包部署。而我的要求是动态的解析xml来生成dynabean,可以这么说VO的定义都是在xml文件中定义的,而从来不会存在于class文件中
      

  9.   

    楼主也许该考虑下所谓的O/X mapping技术,好象有个开源项目castor
    XMLEncoder encoder;
    XMLDecoder decoder;
    String s="gogo";encoder= new XMLEncoder(new FileOutputStream("bean.xml"));
    encoder.writeObject(s);
    decoder=new XMLDecoder(new FileInputStream("system.xml"));
    s=(String)decoder.readObject();根据一定格式的xml文件是可以读取并转化为对象的,XML的具体格式你可以持久化看看
      

  10.   

    上面的system.xml改成bean.xml
    把对象序列化为bean.xml,同样反序列化
      

  11.   

    to killme2008(zane dennis):
      恩,也许这个O/X mapping就是我想要的效果,还想请教一下那这样从xml生成的bean是属于什么类呢,是实现了一个通用的get、set接口么?
      

  12.   

    to soar_king
    O/X mapping我也并未深入研究过,只是在"程序员,2004.01,P86"看到,在一个小项目中实践了一次,如果想深入了解,建议你去找找那篇文章,是透明写的,我没记错的话
      

  13.   

    XMLEncoder,XMLDecoder都是在java.beans包,忘了说明