单例模式加载配置文件类
使用架包: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>
相关推荐
Spring使用dom4j解析XML,创建并初始化Bean实例。 9. **性能与效率** - 虽然DOM4J是基于DOM的,但它对DOM进行了优化,减少了内存消耗,提高了处理速度,特别是在读写大型XML文档时,性能优于标准DOM API。 10. **...
在`CacheInit.java`这个示例中,可能包含了利用DOM4J解析`emailTemplateConfig.xml`文件,提取或修改其中的配置信息,以初始化缓存或其他系统设置的逻辑。通过上述步骤,你可以理解并实现类似的功能。
在深入探讨如何使用DOM4J库来解析XML文件之前,我们先简要了解DOM4J的基本概念及其在Java开发环境中的重要性。DOM4J是一个轻量级、高性能且易于使用的Java库,用于处理XML文档。它提供了类似于DOM、SAX和JDOM的API,...
总结起来,这个示例展示了如何在Java中利用DOM4J解析XML配置文件,结合抽象工厂模式和反射机制来创建和管理对象。这样的设计允许开发者在不修改代码的情况下,通过调整配置文件就能改变系统的运行行为,提高了软件的...
Spring框架大量使用了DOM4J进行XML配置文件的解析和处理,使得我们可以用直观的XML格式定义bean的依赖关系和行为。 首先,DOM4J的核心功能之一是DOM(Document Object Model)模型的构建。DOM是一种树形结构,用于...
1. **初始化解析器**:首先,我们需要导入dom4j的相关库,并创建一个SAXReader对象,它是DOM4J提供的解析器,用于读取XML文件。 ```java import org.dom4j.Document; import org.dom4j.DocumentException; import ...
1. **初始化XML文档结构**:使用DOM4J的`Document`类创建一个新的XML文档实例。然后添加根元素,例如`chart`,表示图表的容器。 2. **添加图表属性**:在根元素下,可以添加各种属性节点,如`caption`、`subCaption...
例如,在Spring框架中,XML配置文件被解析为DOM4J的Document对象,然后通过反射机制创建并初始化bean。 当解析到一个bean定义时,Spring会使用反射找到对应的类并创建实例。如果bean定义包含属性注入,Spring会通过...
每个示例通常会包含初始化解析器、注册事件处理器(对于SAX)、构建XML文档对象(对于DOM)或使用DOM4J API来读取和修改XML内容的步骤。 总的来说,理解和掌握DOM4J、SAX和DOM对于任何涉及XML处理的Java开发人员来...
4. **SysConfigUtil.java**:与`SystemConfig.java`类似,这个类可能是一个系统配置的通用工具类,提供了对XML配置文件的便利操作。它可能包含一些辅助方法,如读取特定配置项、验证配置值等,以简化开发者的代码。 ...
DOM4j是一种广泛应用于Java项目的高效、强大且易于使用的XML API。作为开源软件,DOM4j在SourceForge等平台上可免费获取,并因其在性能、功能和易用性方面的卓越表现而备受推崇。尤其值得一提的是,DOM4j不仅被众多...
在本例中,作者选择使用DOM4j库来进行XML的解析与校验,并且结合了javax.xml.parsers包中的SAXParser来实现XML与XSD之间的校验。这种方法相对直观且易于理解。 #### 示例代码详解 首先,我们来看一下示例中给出的...
### DWR.xml配置文件详解 #### 一、DWR配置文件结构与作用 DWR(Direct Web Remoting)是一个开源的Ajax框架,它允许在浏览器端JavaScript代码直接调用服务器端Java方法,从而简化了传统的AJAX编程。DWR.xml是DWR...
DOM4Jfull.jar的使用方法基本与dom4j.jar一致,但在初始化解析器时,可以通过配置选择使用Alfred2。例如,可以通过以下代码片段指定解析器: ```java DocumentFactory factory = DocumentFactory.getInstance(); ...
在Android开发中,XML文件常用于存储数据或配置信息,如布局文件、资源文件等。本文将深入探讨如何使用DOM(Document Object Model)解析XML在Android应用中的实践。DOM解析方式允许开发者一次性加载整个XML文档到...
在Java Web开发中,`web-config.xml`是应用的核心配置文件,它定义了Servlet、过滤器、监听器、会话超时、MVC框架的配置等关键信息。这个过程通常涉及XML解析和Java对象映射,是理解Web应用程序运行机制的关键部分。...
在Java中,可以使用`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`类来创建和初始化解析器。 2. **创建DOM树**:解析器读取XML文件后,会生成一个`org.w3c.dom.Document`对象,...
在Java中处理XML,我们可以使用多种库和API,如JAXB (Java Architecture for XML Binding),DOM (Document Object Model),SAX (Simple API for XML) 和StAX (Streaming API for XML)。但根据提供的文件名"XStream-...
- **Web开发**: 在Servlet或Spring MVC中,DOM4J用于处理XML配置文件或接收XML请求数据。 - **数据交换**: 在分布式系统间,XML作为数据交换格式,DOM4J提供解析和生成XML的能力。 - **XML配置文件读写**: 处理如...