java使用dom4j解析xml配置文件实现抽象工厂反射示例
程序员文章站
2024-02-13 19:11:46
逻辑描述:
现在我们想在b层和d层加上接口层,并使用工厂。而我们可以将创建b和创建d看作是两个系列,然后就可以使用抽象工厂进行创建了。
配置文件:beans-confi...
逻辑描述:
现在我们想在b层和d层加上接口层,并使用工厂。而我们可以将创建b和创建d看作是两个系列,然后就可以使用抽象工厂进行创建了。
配置文件:beans-config.xml。service-class与dao-class分别对应两个系列的产品。子菜单中id对应接口的命名空间,class对应实现类的命名空间。
复制代码 代码如下:
[html] view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?>
<beans>
<service-class>
<service id="com.xxjstgb.drp.basedata.manager.itemmanager" class="com.xxjstgb.drp.basedata.manager.itemmanagerimpl" />
<service id="com.xxjstgb.drp.flowcard.manager.flowcardmanager" class="com.xxjstgb.drp.flowcard.manager.impl.flowcardmanagerimpl" />
</service-class>
<dao-class>
<dao id="com.xxjstgb.drp.basedata.dao.itemdao" class="com.xxjstgb.drp.basedata.dao.itemdao4oracleimpl" />
<dao id="com.xxjstgb.drp.flowcard.dao.flowcarddao" class="com.xxjstgb.drp.flowcard.dao.impl.flowcarddaoimpl" />
</dao-class>
</beans>
抽象工厂:beanfactory。通过读取配置文件,取得相关对象,并将相关创建好的对象保存在map中。
复制代码 代码如下:
[java] view plaincopyprint?
package com.xxjstgb.drp.util;
import java.util.hashmap;
import java.util.map;
//dom4j
import org.dom4j.document;
import org.dom4j.documentexception;
import org.dom4j.element;
import org.dom4j.io.saxreader;
import com.xxjstgb.drp.basedata.dao.itemdao;
import com.xxjstgb.drp.basedata.manager.itemmanager;
import com.xxjstgb.drp.flowcard.dao.flowcarddao;
import com.xxjstgb.drp.flowcard.manager.flowcardmanager;
/**
* 抽象工厂,主要创建两个系列的产品
* 1、manager系列
* 2、dao系列产品
* @author liuzhengquan
*
*/
public class beanfactory {
private static beanfactory instance=new beanfactory();
//系统缺省配置文件名称
private final string beansconfigfile="beans-config.xml";
//保存dao相关对象
private document doc;
/*
* key=配置文件中的id值
* value=对应了该id的对象
*/
private map servicemap = new hashmap();//保存service相关对象
private map daomap = new hashmap();//保存dao相关对象
private beanfactory(){
try {
doc=new saxreader().read(thread.currentthread().getcontextclassloader().getresourceasstream(beansconfigfile));
} catch (documentexception e) {
e.printstacktrace();
throw new runtimeexception();
}
}
public static beanfactory getinstance(){
return instance;
}
/**
* 根据产品编号取得service系列产品
* @param serviceid
* @return
*/
public synchronized object getserviceobject(class c){
//如果存在相关对象实例,返回
if(servicemap.containskey(c.getname())){
return servicemap.get(c.getname());
}
element beanelt=(element)doc.selectsinglenode("//service[@id=\""+ c.getname() + "\"]");
string classname=beanelt.attributevalue("class");
object service=null;
try {
service=class.forname(classname).newinstance();
//将创建好的对象放到map中
servicemap.put(c.getname(), service);
} catch (exception e) {
throw new runtimeexception();
}
return service;
}
/**
* 根据产品编号取得dao系列产品
* @param daoid
* @return
*/
public synchronized object getdaoobject(class c){
//如果存在相关对象实例,返回
if(daomap.containskey(c.getname())){
return daomap.get(c.getname());
}
element beanelt=(element)doc.selectsinglenode("//dao[@id=\""+c.getname()+"\"]");
string classname=beanelt.attributevalue("class");
object dao=null;
try {
dao=class.forname(classname).newinstance();
//将创建好的对象放到map中
daomap.put(c.getname(), dao);
} catch (exception e) {
throw new runtimeexception();
}
return dao;
}
/**
* 测试
* @param args
*/
public static void main(string[] args){
itemmanager itemmanager=(itemmanager)beanfactory.getinstance().getserviceobject(itemmanager.class);
system.out.println("itemmanager"+itemmanager);
itemdao itemdao=(itemdao)beanfactory.getinstance().getdaoobject(itemdao.class);
system.out.println("itemdao:"+itemdao);
flowcardmanager flowcardmanager=(flowcardmanager)beanfactory.getinstance().getserviceobject(flowcardmanager.class);
//flowcardmanager flowcardmanager=new flowcardmanagerimpl();
system.out.println(flowcardmanager);
flowcarddao flowcarddao=(flowcarddao)beanfactory.getinstance().getdaoobject(flowcarddao.class);
//flowcarddao flowcarddao=new flowcarddaoimpl();
system.out.println("flowcarddao:"+flowcarddao);
}
}