java配置dom4j_java使用dom4j解析xml配置文件实现抽象工厂反射示例

逻辑描述:

现在我们想在B层和D层加上接口层,并使用工厂。而我们可以将创建B和创建D看作是两个系列,然后就可以使用抽象工厂进行创建了。

配置文件:beans-config.xml。service-class与dao-class分别对应两个系列的产品。子菜单中id对应接口的命名空间,class对应实现类的命名空间。

[html] view plaincopyprint?

抽象工厂: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);

}

}

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值