单例模式加载配置文件类
使用架包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar、log4j-1.2.17.jar
代码:
package com.wjq.project.loadFile;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* @Title:JAVA项目初始化xml配置文件类
* @Description: 使用dom4j解析xml配置文件; 使用单例模式初始化类; 定时重新加载配置文件,时间可配
* @author wjq
* @date 2013-07-19
*/
public class LoadXmlFile_dom4j {
//日志
private static Logger log = Logger.getLogger(LoadXmlFile_dom4j.class);
//配置文件
private static final String CONFIG_FILE = "loadFile_loadXmlFile.xml";
//dom4j 对象
private Document document=null;
//IP地址
private String ip = null;
//端口号
private String port = null;
//重启加载配置文件周期,默认值:12,单位:小时
private int reloadTime=12;
//告警级别转换
private Map<String, String> alarmLevelsMap=new HashMap<String, String>();
//工单状态数据转换
private Map<String, String> sheetStatusTransMap=new HashMap<String, String>();
/ 单例模式 start /
/**
* 私有化构造方法
*/
private LoadXmlFile_dom4j(){
log.info("加载配置文件: "+CONFIG_FILE);
loadConfig();
//开启定时加载配置文件的线程
Thread reloadConfFile = new Thread(new ReloadConfFile());
reloadConfFile.start();
}
/**
* 内部静态类,实例化本类对象
* @author wjq
*
*/
public static class ClassInstance{
//在内部静态类中实例化LoadXmlFile对象
private static final LoadXmlFile_dom4j instance=new LoadXmlFile_dom4j();
}
/**
* 对外提供本类实例化对象
* @return
*/
public static LoadXmlFile_dom4j getInstance(){
return ClassInstance.instance;
}
/ 单例模式 end /
/**
* 加载配置文件信息
*/
private void loadConfig() {
try {
InputStream inputStream = LoadXmlFile_dom4j.class.getResourceAsStream("/project/"+CONFIG_FILE);
if(inputStream!=null){
SAXReader saxReader=new SAXReader();
this.document=saxReader.read(inputStream);
if(document==null){
return;
}
this.ip=loadSingleNode("config/myProject/ip");
this.port=loadSingleNode("config/myProject/port");
this.reloadTime=Integer.valueOf(loadSingleNode("config/myProject/reloadTime"));
this.alarmLevelsMap=loadAttributeMap("config/myProject/alarmLevels");
this.sheetStatusTransMap=loadTextMap("config/myProject/sheetStatusTrans");
}else{
log.error("配置文件不存在,请确认已经将配置文件["+CONFIG_FILE+"]已经放在[project]目录下");
}
} catch (Exception e) {
log.error("解析配置文件["+CONFIG_FILE+"]异常",e);
}
}
/**
* ReloadConfFile thread
* 定时重新加载xml配置文件 线程
* 默认每隔12小时加载一次xml配置文件,
* @author wjq
*/
private class ReloadConfFile implements Runnable {
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(reloadTime*60*60*1000);
} catch (InterruptedException e) {
}
log.info("重新加载配置文件:"+CONFIG_FILE);
loadConfig();
}
}
}
/**
* 获取单个节点的文本值
* @param nodePath
* @return
*/
private String loadSingleNode(String nodePath){
Element element=(Element)document.selectSingleNode(nodePath);
String nodeText=element.getTextTrim();
log.info(element.getName()+"="+nodeText);
return nodeText;
}
/**
* 加载from、to在元素属性节点上的转换关系
* from为key、to为value
* @param nodePath 节点路径
* @return
*/
private Map<String, String> loadAttributeMap(String nodePath){
Map<String, String> fromToMap=new HashMap<String, String>();
//日志信息
String logMessage="";
//先清空Map内容
fromToMap.clear();
Element element=(Element) document.selectSingleNode(nodePath);
logMessage=element.getName()+":[";
List elementList =element.elements();
Iterator iter=elementList.iterator();
while(iter.hasNext()) {
Element el=(Element)iter.next();
String key= el.attributeValue("from").trim();
String value= el.attributeValue("to").trim();
fromToMap.put(key, value);
logMessage=logMessage+";from="+key+",to="+value;
}
logMessage=logMessage.replaceFirst(";", "")+"]";
log.info(logMessage);
return fromToMap;
}
/**
* 加载from、to为单独元素的转换关系
* from为key、to为value
* @param nodePath 节点路径
* @return
*/
private Map<String, String> loadTextMap(String nodePath){
Map<String, String> fromToMap=new HashMap<String, String>();
//日志信息
String logMessage="";
//先清空Map内容
fromToMap.clear();
Element element=(Element) document.selectSingleNode(nodePath);
logMessage=element.getName()+":[";
List elementList =element.elements();
Iterator iter=elementList.iterator();
while(iter.hasNext()) {
Element el=(Element)iter.next();
String key= el.element("from").getTextTrim();
String value= el.element("to").getTextTrim();
logMessage=logMessage+";from="+key+",to="+value;
}
logMessage=logMessage.replaceFirst(";", "")+"]";
log.info(logMessage);
return fromToMap;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public Map<String, String> getAlarmLevelsMap() {
return alarmLevelsMap;
}
public void setAlarmLevelsMap(Map<String, String> alarmLevelsMap) {
this.alarmLevelsMap = alarmLevelsMap;
}
public Map<String, String> getSheetStatusTransMap() {
return sheetStatusTransMap;
}
public void setSheetStatusTransMap(Map<String, String> sheetStatusTransMap) {
this.sheetStatusTransMap = sheetStatusTransMap;
}
/**
* @param args
*/
public static void main(String[] args) {
LoadXmlFile_dom4j loadXmlFile=LoadXmlFile_dom4j.getInstance();
}
}
配置文件:
<?xml version="1.0" encoding="Gb2312"?> <config> <myProject> <!-- IP地址 --> <ip>127.0.0.1</ip> <!-- 端口号 --> <port>51088</port> <!-- 第一种数据转换方法 from为key、to为value--> <alarmLevels> <level from="紧急告警" to="1" /> <level from="重要告警" to="2" /> <level from="次要告警" to="3" /> <level from="警告告警" to="4" /> </alarmLevels> <!-- 第二种数据转换方法 from为key、to为value--> <sheetStatusTrans> <sheetStatusRecord> <from>草稿</from><to>1</to> </sheetStatusRecord> <sheetStatusRecord> <from>一级处理中</from><to>2</to> </sheetStatusRecord> <sheetStatusRecord> <from>二级处理中</from><to>3</to> </sheetStatusRecord> <sheetStatusRecord> <from>三级处理中</from><to>4</to> </sheetStatusRecord> </sheetStatusTrans> <!-- 重新读取配置文件周期,默认值:12,单位:小时 --> <reloadTime>12</reloadTime> </myProject> </config>