工厂+反射实现动态配置数据库

一、目的

  有时候项目中用的是SqlServer数据库,有时候又会换成Oracle,或者有时候要用MySQL,如何做才能充分复用代码?根据以上需求,业务逻辑层不会变动,我们只需要变动业务逻辑层所依赖的Dao层就可以。

二、什么是反射机制

  简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。

三、实现

  先看一下这个demo的宏观结构:


        


  1、采用抽象工厂建立物料Itemdao层(抽象工厂、抽象产品、具体工厂、具体产品);在配置文件sys_config中写出具体的工厂。

<config>	
	<dao-factory>
		<item-dao-factory>drp.basedata.dao.ItemDaoFactory4Oracle</item-dao-factory>
	</dao-factory>
</config>

  2、采用dom4j读取sys_config配置文件中的内容。把这些操作都封装在XMLConfitReader这个类中。注意:必须引用2个关键jar包,否则会报错。(dom4jjaxen2jar包)

package xx.util;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class XMLConfitReader {
	//单例懒汉模式
	private  static XMLConfitReader instance= null;
	private Map<String, String> daoFactoryMap = new HashMap<String, String>();
	//构造函数
	private  XMLConfitReader() {
		//创建文件读取流
		SAXReader reader = new SAXReader();
		//指定要加载读取的xml文件
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml"); 
		try 
		{			
			//生成文档对应实体			
			Document doc = reader.read(in);
			//读取文档内容
			List daoFactoryList = doc.selectNodes("/config/dao-factory/*");
			
			for (int i = 0; i < daoFactoryList.size(); i++) {
				Element daoFactoryElt = (Element)daoFactoryList.get(i);
				String tabNameString = daoFactoryElt.getName();
				String tabTextString = daoFactoryElt.getText();
				daoFactoryMap.put(tabNameString, tabTextString);
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		} 
	}
	public static synchronized XMLConfitReader getInstance() {
		if (instance == null) {
			instance = new XMLConfitReader();
		}
		return instance;
	}
	
	/*
	 * 根据标签名取得DaoFactory的名字
	 */
	public String getDaoFactory(String name) {
		return daoFactoryMap.get(name);
	}
}

  3、客户端调用(ItemManagerImpl业务逻辑层调用它对应的Dao产品)

public class ItemManagerImpl implements ItemManager {
	private ItemDaoFactory factory =null;
	@Override
	public void addItem(Item item) {
		//拿到配置文件中的根节点名称
		String className = XMLConfitReader.getInstance().getDaoFactory("item-dao-factory");
		
		try {
			//反射机制生成对象实例装载到内存
			factory = (ItemDaoFactory)Class.forName(className).newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		//根据反射出的对象factory去创建dao
		ItemDao itemDao = factory.createItemDao();
		Connection conn = null;
		itemDao.addItem(conn, item);
	}
}


  运用配置文件+反射大大便利了系统的扩展性,或代码的重复利用。对xml、dom4j、以及反射的思想会用的特别多。 Class.forName("com.mysql.jdbc.Driver.class").newInstance() 这句就应用了反射思想,创建出一个对象实例,有了对象就可以拿出里边的所有信息。这也就验证了,一切基于对象,一切面向对象,OOP!

 


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值