使用 struts 组件 Digester 实现 spring 中对 bean 的管理的类似的功能.<o:p></o:p>
Beans.xml的定义:<o:p></o:p>
< ?xml version="1.0" encoding="UTF-8"? ><o:p></o:p>
< beans ><o:p></o:p>
< bean id="conn" type="dao.Conn"/><o:p></o:p>
< bean id="id1" type="dao.dao1"/><o:p></o:p>
< /beans ><o:p></o:p>
<o:p> </o:p>
Beans.java<o:p></o:p>
package testDigester.myTest1;<o:p></o:p>
<o:p> </o:p>
import java.util.HashMap;<o:p></o:p>
<o:p> </o:p>
public class Beans {<o:p></o:p>
<o:p> </o:p>
private HashMap beans = new HashMap();<o:p></o:p>
<o:p> </o:p>
/**<o:p></o:p>
* @ return beansを戻します<o:p></o:p>
*/<o:p></o:p>
public HashMap getBeans() {<o:p></o:p>
return beans;<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
/**<o:p></o:p>
* @ param beansを設定します<o:p></o:p>
*/<o:p></o:p>
public void setBeans(HashMap beans) {<o:p></o:p>
this.beans = beans;<o:p></o:p>
}<o:p></o:p>
/**<o:p></o:p>
* the beans can not contain same keys,so <o:p></o:p>
* we hava to try, this will be done later<o:p></o:p>
* @ author pony<o:p></o:p>
*/<o:p></o:p>
<o:p> </o:p>
public void addBean(Bean bean){<o:p></o:p>
this.getBeans().put(bean.getId(),bean);<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
/**<o:p></o:p>
* get Bean by id<o:p></o:p>
*/<o:p></o:p>
public Bean findBean(String id){<o:p></o:p>
return (Bean)this.getBeans().get(id);<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
<o:p>
</o:p>
Bean.java<o:p></o:p>
package testDigester.myTest1;<o:p></o:p>
<o:p> </o:p>
public class Bean {<o:p></o:p>
<o:p> </o:p>
private String id;<o:p></o:p>
private String type;<o:p></o:p>
<o:p></o:p>
/**<o:p></o:p>
* @ return Returns the id.<o:p></o:p>
*/<o:p></o:p>
public String getId() {<o:p></o:p>
return id;<o:p></o:p>
}<o:p></o:p>
/**<o:p></o:p>
* @ param id The id to set.<o:p></o:p>
*/<o:p></o:p>
public void setId(String id) {<o:p></o:p>
this.id = id;<o:p></o:p>
}<o:p></o:p>
/**<o:p></o:p>
* @ return Returns the type.<o:p></o:p>
*/<o:p></o:p>
public String getType() {<o:p></o:p>
return type;<o:p></o:p>
}<o:p></o:p>
/**<o:p></o:p>
* @ param type The type to set.<o:p></o:p>
*/<o:p></o:p>
public void setType(String type) {<o:p></o:p>
this.type = type;<o:p></o:p>
} <o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
ParseRule.java<o:p></o:p>
package testDigester.myTest1;<o:p></o:p>
<o:p> </o:p>
import org.apache.commons.digester.Digester;<o:p></o:p>
import org.apache.commons.digester.RuleSetBase;<o:p></o:p>
/ / 用来制定规则<o:p></o:p>
/ / 下面的RuleSetBase必须继承<o:p></o:p>
public class ParseRule extends RuleSetBase{<o:p></o:p>
public void addRuleInstances(Digester d) {<o:p></o:p>
//第一次遇到匹配的beans时,建立一个Beans对象,并放入栈顶<o:p></o:p>
d.addObjectCreate("beans",Beans.class);<o:p></o:p>
//复制第一个beans对象的attribute属性<o:p></o:p>
d.addSetProperties("beans");<o:p></o:p>
//第一次遇到匹配的beans/bean时,建立一个Bean对象,并放入栈顶<o:p></o:p>
d.addObjectCreate("beans/bean",Bean.class);<o:p></o:p>
//复制bean对象的attribute属性<o:p></o:p>
d.addSetProperties("beans/bean");<o:p></o:p>
//以后遇到匹配的"beans/bean",使用了addBean方法处理<o:p></o:p>
d.addSetNext("beans/bean","addBean");<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
<o:p> </o:p>
<o:p>
</o:p>
BeanParser.java<o:p></o:p>
package testDigester.myTest1;<o:p></o:p>
<o:p> </o:p>
import java.io.IOException;<o:p></o:p>
import java.io.InputStream;<o:p></o:p>
import java.sql.ResultSet;<o:p></o:p>
import java.sql.SQLException;<o:p></o:p>
<o:p> </o:p>
import org.apache.commons.digester.Digester;<o:p></o:p>
import org.xml.sax.SAXException;<o:p></o:p>
<o:p> </o:p>
import dao.Conn;<o:p></o:p>
<o:p> </o:p>
public class BeanParser {<o:p></o:p>
<o:p> </o:p>
/**<o:p></o:p>
* @ author pony<o:p></o:p>
*/<o:p></o:p>
InputStream is = null;<o:p></o:p>
<o:p> </o:p>
public BeanParser() {<o:p></o:p>
is = this.getClass().getClassLoader().getResourceAsStream(<o:p></o:p>
"testDigester/myTest1/beans.xml");<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public static void main(String[] args) {<o:p></o:p>
<o:p> </o:p>
test2();<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
public Object getBean(String id) {<o:p></o:p>
<o:p> </o:p>
if (is == null) {<o:p></o:p>
System.out.println("no configuration is found");<o:p></o:p>
}<o:p></o:p>
Bean bean = null;<o:p></o:p>
String type = "";<o:p></o:p>
Digester digester = new Digester();<o:p></o:p>
ParseRule rule = new ParseRule();<o:p></o:p>
rule.addRuleInstances(digester);<o:p></o:p>
<o:p> </o:p>
Beans beans = null;<o:p></o:p>
try {<o:p></o:p>
beans = (Beans) digester.parse(is);<o:p></o:p>
bean = beans.findBean(id);<o:p></o:p>
type = bean.getType();<o:p></o:p>
} catch (IOException e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
} catch (SAXException e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
return makeInstance(type);<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public Object makeInstance(String type) {<o:p></o:p>
Object obj = (Object) null;<o:p></o:p>
if (type == null) {<o:p></o:p>
return (Object) null;<o:p></o:p>
}<o:p></o:p>
try {<o:p></o:p>
obj = Class.forName(type).newInstance();<o:p></o:p>
} catch (ClassNotFoundException e) {<o:p></o:p>
System.out.println("no class is found");<o:p></o:p>
e.printStackTrace();<o:p></o:p>
} catch (IllegalAccessException e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
} catch (InstantiationException e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
System.out.println(obj.getClass());<o:p></o:p>
return obj;<o:p></o:p>
}<o:p></o:p>
public static void test2() {<o:p></o:p>
BeanParser parser = new BeanParser();<o:p></o:p>
Conn conn = (<st1:state><st1:place>Conn</st1:place></st1:state>) parser.getBean("conn");<o:p></o:p>
if (conn != null) {<o:p></o:p>
ResultSet rs = conn.executeQuery("SELECT * FROM AMMM");<o:p></o:p>
try {<o:p></o:p>
while (rs.next()) {<o:p></o:p>
System.out.println(rs.getBigDecimal("id").toString());<o:p></o:p>
}<o:p></o:p>
} catch (SQLException e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
} else {<o:p></o:p>
System.out.println("connection error!");<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>