工厂模式解耦+dom4j解析xml

我们当前的开发末实现,service层对DAO层有依赖,例如在UserServcieImp中出现了

private ProductDao dao = new ProductDaoImpl();

假如我们做了一个产品OA,但是我们没有办法确定客户采用什么样的数据库,此时我们需要

需要为当前项目开发不同的数据库的版本,例如为oracle,sqlserver,mysql分别开发不同的DAO的实现,但是在项目具体的运行时,我们由无法确定到底执行那种版本.我们可以通过配置文件来配置dao层的各个具体的实现.

 private ProductDao dao = (ProductDao) BeanFactory.createObject("productDao");

BeanFactory:

public class BeanFactory {

	
	//解析XML
	public static Object createObject(String name) {
		try {
			//通过传递过来的name获取application.xml中name对应的class值
			
			//获取到Document对象
			SAXReader reader=new SAXReader();
			//如果获取application.xml文件的输入流 (application.xml必须位于src下)
			InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("application.xml");
			Document doc=reader.read(is);
			//通过Document对象获取根节点  beans
			Element rootElement = doc.getRootElement();
			//通过根节点获取到根节点下所有的子节点 bean,返回集合
			List<Element> list = rootElement.elements();
			//遍历集合,判断每个元素上的id的值是否和当前的name一致
			for (Element ele : list) {
				//ele相当于beans节点下的每个bean
				//获取到当前节点的id属性值
				//如果一致,获取到当前元素上class属性值
				String id=ele.attributeValue("id");
				if(id.equals(name)){
					String str=ele.attributeValue("class");
					//通过反射创建对象并且返回
					Class clazz=Class.forName(str);
					//利用class值通过反射创建对象返回
					return  clazz.newInstance();
					
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String[] args) throws SQLException {
		
	}
	
}

xml: 

注意:BeanFactory.class.getClassLoader().getResourceAsStream获取文件输入流,该application.xml必须位于src下 

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="productDao" class="cn.heima.store.dao.daoimpl.ProductDaoImpl"></bean>
</beans>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值