单例模式加载配置文件类
使用架包:jdom-2.0.5.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.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; /** * @Title:JAVA项目初始化xml配置文件类 * @Description: 使用jdom解析xml配置文件; 使用单例模式初始化类; 定时重新加载配置文件,时间可配 * @author wjq * @date 2013-07-19 */ public class LoadXmlFile_jdom { //日志 private static Logger log = Logger.getLogger(LoadXmlFile_jdom.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_jdom(){ log.info("加载配置文件: "+CONFIG_FILE); loadConfig(); //开启定时加载配置文件的线程 Thread reloadConfFile = new Thread(new ReloadConfFile()); reloadConfFile.start(); } /** * 内部静态类,实例化本类对象 * @author wjq * */ public static class ClassInstance{ //在内部静态类中实例化LoadXmlFile对象 private static final LoadXmlFile_jdom instance=new LoadXmlFile_jdom(); } /** * 对外提供本类实例化对象 * @return */ public static LoadXmlFile_jdom getInstance(){ return ClassInstance.instance; } ///////////////////////////////////////////// 单例模式 end ///////////////////////////////////////////// /** * 加载配置文件信息 */ private void loadConfig() { try { InputStream inputStream = LoadXmlFile_jdom.class.getResourceAsStream("/project/"+CONFIG_FILE); if(inputStream!=null){ SAXBuilder builder = new SAXBuilder(); this.document = builder.build(inputStream); if(document==null){ return; } this.ip=loadSingleNode("myProject/ip"); this.port=loadSingleNode("myProject/port"); this.reloadTime=Integer.valueOf(loadSingleNode("myProject/reloadTime")); this.alarmLevelsMap=loadAttributeMap("myProject/alarmLevels"); this.sheetStatusTransMap=loadTextMap("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 root = document.getRootElement(); String[] elementsName = nodePath.split("\\/"); for (int i = 0; i < elementsName.length; i++) { root = root.getChild(elementsName[i]); } String nodeText =root.getTextTrim(); log.info(root.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 root = document.getRootElement(); String[] elementsName = nodePath.split("\\/"); for (int i = 0; i < elementsName.length; i++) { root = root.getChild(elementsName[i]); } logMessage=root.getName()+":["; List childrenList = root.getChildren(); Iterator iter=childrenList.iterator(); while(iter.hasNext()) { Element el=(Element)iter.next(); String key= el.getAttributeValue("from").trim(); String value= el.getAttributeValue("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 root = document.getRootElement(); String[] elementsName = nodePath.split("\\/"); for (int i = 0; i < elementsName.length; i++) { root = root.getChild(elementsName[i]); } logMessage=root.getName()+":["; List childrenList = root.getChildren(); Iterator iter=childrenList.iterator(); while(iter.hasNext()) { Element el=(Element)iter.next(); String key= el.getChild("from").getTextTrim(); String value= el.getChild("to").getTextTrim(); fromToMap.put(key, value); 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) { System.out.println("使用jdom加载xml配置文件"); LoadXmlFile_jdom loadXmlFile=LoadXmlFile_jdom.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>
相关推荐
1. **初始化**:启动Spring应用上下文,加载配置文件,包括Spring的bean定义以及iBatis的SqlSessionFactory配置。 2. **数据获取**:使用iBatis的DAO接口执行SQL查询,获取需要转换为XML格式的数据。这些数据可能是...
通过查阅API文档,你可以学习如何初始化XML文档、查找和修改元素、处理命名空间,以及如何进行XML的序列化和反序列化等操作。 此外,压缩包中的“简单说明”可能包含了一些基本的使用示例和注意事项,对于初学者来...
通过以上步骤,我们可以轻松地从XML配置文件中读取数据,并将其转换为Java对象,便于在应用程序中使用。不过,需要注意的是,实际应用中可能还需要处理异常,进行类型检查,以及更复杂的对象初始化逻辑。
1. **初始化文件**: - 首先定义了一个文件路径:`"c:\\text.xml"`。 - 使用`new File(filename)`创建了一个`File`对象,用于表示这个文件。 - 检查文件是否已经存在,如果存在,则尝试删除它。这一步确保每次...
DWR.xml配置文件说明书 1、 建立dwr.xml 配置文件 任何一个dwr.xml的文件都需要包含DWR DOCTYPE的声明行,格式如下: <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" ...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...
当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将深入探讨BeanFactory的工作原理,以及XML配置文件在其中的作用。 首先,BeanFactory...
EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
在这里,我们将使用JDOM解析XML配置文件,这些配置文件通常用来定义对象及其依赖关系,就像在Spring中那样。 1. **创建配置文件** 创建一个XML配置文件,例如`beans.xml`,来定义Bean(即Java对象)和它们的依赖...
EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...
这通常用于确定资源文件(如XML配置文件)的位置。在Java中,资源文件可以被放置在项目的类路径下,例如在src/main/resources目录中,通过这种方式获取路径,可以确保无论项目是在开发环境中还是部署后的环境中,都...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1. 加载配置:读取XML配置文件,创建并初始化多个`BaseConnBean`对象。 2. 创建连接池:根据配置信息,使用DBCP提供的`BasicDataSource`类实例化每个连接池。 3. 获取连接:在需要访问数据库时,通过连接池的`get...
在Spring中,反射被用来解析XML配置文件,创建和初始化对象。在这个例子中,我们使用了JDOM库来解析XML文件,JDOM是一个用于处理XML文档的API,提供了构建、修改和操作XML文档的功能。 下面我们将详细阐述Spring ...
`BaseConnBean`类是用来表示XML配置文件中的每个数据库连接池的Java对象。它包含了连接池所需的所有属性,如名称、用户名、密码、JDBC URL、最大连接数、等待时间和驱动类名,并提供了对应的getter和setter方法。 `...
这个库特别适用于那些需要频繁解析XML配置文件的项目,它可以减少手动编写XML解析代码的工作量,提高代码的可读性和可维护性。在"Commons-digesterXML解析Demo"中,我们将探讨如何利用Digester库来实现这一功能。 1...