Java单例模式实例---读取配置文件

原文地址:http://www.linuxso.com/architecture/16275.html

因为配置文件里的信息都是一样的,不论哪个用户要登录系统访问连接数据库,都是要读取配置文件的,这样每次如果都要实例化读取配置文件的类,这样就会非常浪费系统资源。因此使用单例模式:只要实例化一次之后,有了一个对象,之后就不再需要实例化了。


  为了配置文件修改的方便将配置文件的信息单独放到一个xml文件中。

<?xml version="1.0" encoding="UTF-8"?>
<config><!-- 根元素配置文件 -->
  <db-info><!--配置文件的子元素(数据库信息)  -->
     <!-- 数据库信息子元素(连接数据库类型,名字,用户名,密码) -->
 	 <driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
	 <url>jdbc:oracle:thin:@linuxso.com:1521:ANDY</url> 
	 <user-name>drp</user-name>
	 <password>drp</password>
  </db-info>
</config>
 使用DOM4j的方式访问读取配置文件,并且保存到实体类JdbcConfig中

package com.andy.drp.util;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * 解析xml文件
 */
public class XmlConfigReader {
	
	//懒汉式(用的时候再创建),延迟加载
	private static XmlConfigReader instance = null;
	
	//保存jdbc相关配置信息
	private JdbcConfig jdbcConfig = new JdbcConfig();
	
	//构造方法让其private,这就不让外界利用new创建此类实例
	private XmlConfigReader(){
		
		SAXReader reader = new SAXReader();
		//从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。此方法通过系统类加载器
		InputStream in =Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-conf.xml");
		try{
			
			Document doc = reader.read(in);
			
			//取得jdbc相关配置信息
			Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
			Element urlElt = (Element)doc.selectObject("/config/db-info/url");
			Element userNameElt  = (Element)doc.selectObject("/config/db-info/user-name");
			Element passwordElt = (Element)doc.selectObject("/config/db-info/password");
			
			//jdbc取得相关的配置
			jdbcConfig.setDriverName(driverNameElt.getStringValue());
			jdbcConfig.setUserName(userNameElt.getStringValue());
			jdbcConfig.setPassword(passwordElt.getStringValue());
			jdbcConfig.setUrl(urlElt.getStringValue());	
		}catch(DocumentException e){
			e.printStackTrace();
		}
	}
	
	//静态方法访问时,直接访问不需要实例化
	public static synchronized XmlConfigReader getInstance(){//synchronized表示同时只能一个线程进行实例化
		if(instance == null){//如果两个进程同时进入时,同时创建很多实例,不符合单例
			instance = new XmlConfigReader();
		}
		return instance;
	}
	
	/*
	 *返回jdbc相关配置
	 *@return 
	 */
	public JdbcConfig getJdbcConfig(){
		return jdbcConfig;
	}
	
	public static void main(String[] args) {
	   //getInstance()是一个静态方法,不需要实例化
		JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
	}

}
        使用DbUtill与oracle数据库连接

/*
 * 封装数据常用操作
 * author:andy
 */
public class DbUtil {
	/*
	 * 取得Connection
	 * DbUtill是工具类,一般工具类都要使用静态方法,直接访问,如果是成员方法就比较麻烦了,每次调用都要实例化
	 * @return--throws ClassNotFoundException
	 */
	public static Connection getConnection() {
		Connection conn =null;
		try{
			//实例化一个存取配置信息的实例
			JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
			//连接数据库的名字(oracle.jdbc.driver.OracleDriver)
			Class.forName(jdbcConfig.getDriverName());
			//获得连接url、username、password的connection
			conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword());
		}catch(ClassNotFoundException e){
			e.printStackTrace();
			
		}catch(SQLException e){
			e.printStackTrace();
		}
		return conn;
	}

	public static void main(String[] args){
		System.out.println(DbUtil.getConnection());	
	}
}


你可能感兴趣的:(Java单例模式实例---读取配置文件)