在上篇文章中步步剖析单例模式我们已经剖析了单例模式,在文章的最后中说到,单例模式在读取配置文件的时候比较适用,接下来的内容便是通过具体的代码来展示如何在一个项目中的读取配置文件中适用单例模式.
在接下来的文章将会介绍如何通过单例模式来读取配置文件.
在DRP项目中便是通过单例模式对配置文件进行读取,下面将整个的例子通过代码展现出来.
JdbcConfig类(Jdbc配置类,配置相关读取数据库的信息)
package com.bjpowernode.drp.util;
/**
* jdbc配置信息
* @author jnqqls
*
*/
public class JdbcConfig {
//重写Object的toString方法
@Override
public String toString() {
return this.getClass().getName()+ "{drivarName:" + driverName + ",url:"+url + ",usernName:" +userName;
}
//驱动名称
private String driverName;
//地址
private String url;
//用户名
private String userName;
//密码
private String passWord;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
数据库配置文件:sys-conf.xml(配置连接数据库相关信息)
<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
<username>drp1</username>
<password>drp1</password>
</db-info>
</config>
XmlConfigReader类:采用单例模式解析XML配置文件.
package com.bjpowernode.drp.util;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
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;
/**
* 采用单例模式解析XML配置文件
* @author jnqqls
*
*/
public class XmlConfigReader {
//单例模式-懒汉式(真正使用的时候实例化<延迟加载>)
private static XmlConfigReader instance =null;
//保存jdbc相关配置信息
private JdbcConfig jdbcConfig = new JdbcConfig();
//私有构造器,通过SAXReader的方式读取配置文件sys-config.xml文件中的数据库信息.
private XmlConfigReader(){
// 使用SAXReader的方式读取XML
SAXReader reader = new SAXReader();
//通过当前线程装载文件配置文件
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-conf.xml");
try {
//将配置文件装载到Document对象中
Document doc = reader.read(in);
/**
* 采用Xpath方式获取配置文件中的相关信息
*/
//取得jdbc相关配置信息.
Element driverName = (Element)doc.selectObject("/config/db-info/driver-name");
Element url = (Element)doc.selectObject("/config/db-info/url");
Element passWord = (Element)doc.selectObject("/config/db-info/password");
Element userName = (Element)doc.selectObject("/config/db-info/username");
//将从xml获取的配置信息写入jdbcConfig实例中
jdbcConfig.setDriverName(driverName.getStringValue());
jdbcConfig.setPassWord(passWord.getStringValue());
jdbcConfig.setUrl(url.getStringValue());
jdbcConfig.setUserName(userName.getStringValue());
System.out.println("读取jdbcConfig-->>"+jdbcConfig);
} catch (DocumentException e) {
e.printStackTrace();
}
}
//公共的静态的入口方法
//为了防止多线程多个对象保证单例,添加同步关键字synchronized.
public static synchronized XmlConfigReader getInstance(){
//判断是否实例化?
if (instance == null){
instance = new XmlConfigReader();
}
return instance;
}
/**
* 返回jdbc相关配置
* @return
*/
public JdbcConfig getJdbcConfig(){
return jdbcConfig;
}
/**
* 测试是否成功读取相关配置信息.
* @param args
*/
public static void main(String[] args){
JdbcConfig jdbcConfig =XmlConfigReader.getInstance().getJdbcConfig();
System.out.println(jdbcConfig.getDriverName());
System.out.println(jdbcConfig.getPassWord());
System.out.println(jdbcConfig.getUrl());
System.out.println(jdbcConfig.getUserName());
System.out.println(jdbcConfig);
}
}
测试结果:
读取jdbcConfig-->>com.bjpowernode.drp.util.JdbcConfig{drivarName:oracle.jdbc.driver.OracleDriver,url:jdbc:oracle:thin:@localhost:1521:orcl,usernName:drp1
oracle.jdbc.driver.OracleDriver
drp1
jdbc:oracle:thin:@localhost:1521:orcl
drp1
com.bjpowernode.drp.util.JdbcConfig{drivarName:oracle.jdbc.driver.OracleDriver,url:jdbc:oracle:thin:@localhost:1521:orcl,usernName:drp1
小结:在DRP项目中,该数据库的配置信息存放在一个XML文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。同时也应该注意,单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。