最近比较厌烦维护程序里一票的实体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的方法和思路。谢谢
我现在想到的有个比较粗陋的方法,就是把属性抽象成一个对象来保存属性的名称和默认值
public class MetaData{
public String name;
public String value;
}
xml文件中保存MetaData对象的list,通过betwixt来读取,并将其中的属性及默认值set进DynaBean中。这个原始的DynaBean就是模板,程序中用到这个bean的时候,就通过clone这个模板bean来获得。 自我感觉这样做也挺麻烦的,而且限定了bean的属性只能为String,离理想的目标还有很大距离。希望大家可以提供一些更为方便灵活的从xml生成bean的方法和思路。谢谢
<?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]) ;
}
}
}
=========
我是不想写DataInfo这个类,想达到通过xml直接动态生成bean的目的
to zdsdiablo:
用映射的话还是要自己把这个bean写出来,当需要的bean的种类很多的时候还是很麻烦。比方说我的系统里用到很多种不同格式的文本文件,我不想对每种文件格式都写个对应的bean,而是想通过定义一个xml模板来动态的生成
可以 sql 语句,xml文档,java 类三者任意转换...
不过xml生成的java类中 方法只有 get 和 set .其它方法要自己写..
如果我没理解错,你是不想在 design-time 写这样一个 Class 的,那么就一定要在 run-time 搞一个 Class 出来。据说 CGLib 可以做这样的事情。
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
我本来也考虑过用xmlspy或是XMLBeans,但还是觉得复杂了,而且作用不大。因为用这两种方法的话都是要预先生成java类的代码的,有什么改动的话还要重新生成代码,再打包部署。而我的要求是动态的解析xml来生成dynabean,可以这么说VO的定义都是在xml文件中定义的,而从来不会存在于class文件中
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的具体格式你可以持久化看看
把对象序列化为bean.xml,同样反序列化
恩,也许这个O/X mapping就是我想要的效果,还想请教一下那这样从xml生成的bean是属于什么类呢,是实现了一个通用的get、set接口么?
O/X mapping我也并未深入研究过,只是在"程序员,2004.01,P86"看到,在一个小项目中实践了一次,如果想深入了解,建议你去找找那篇文章,是透明写的,我没记错的话