SCPPO(二十二):读取配置文件---程序猿必不可少的技能
【前言】
现在在做一个.Net项目,在做项目的时候用到了读取配置文件;无巧不成书,最近在自己学习Java,刚好也学到了读取配置文件这块儿,于是乎整理了整理读取配置文件的方式。
【那点事】
一、我与配置文件相识之路
1、记得第一次接触配置文件是在long long ago自己做的第一个项目机房收费系统中用到,当时用到的是从配置文件中读取连接数据库的相关信息,由于那个项目是自己的练手项目一直是用的本机的数据库,说实话当时也没有感受到它很大的用处;
2、第一次感触到它的用处的时候是在考试系统维护的时候部署系统的时候(参考:那些年我们一起参加的活动:15年上半年考试维护过程中精彩小插曲),当时为了保障高可用,部署一套正式系统和备用系统,部署中的一个最重要的环节是修改配置文件中的数据库信息;
3、参加工作后在项目中又真正体会到它的强大威力。
二、为什么要从配置文件中读?
1、刚在度娘上搜了一下,结果出来的都是解决配置文件错误的;看来配置文件的好处已经深入人心,已经成为程序员的共识了吧!
2、不过个人觉得探讨一下它的好处还是蛮有必要滴!依据本人的工作经验,目前体会到两点好处:
(1)灵活可配;
①不用配置文件,修改系统过程:修改源码—>编译—>部署;
②加入配置文件,修改系统过程:编辑配置文件保存即可;
(2)统一管理;
①不用配置文件,大部分是在程序中直接将值写死,而这些值会在系统中好多地方用到,如果要更改,需要修改多处;
②加入配置文件,将其做为一个变量写入到配置文件中,需要修改时只需修改配置文件中一处即可。
3、凡事有利必有弊,目前能想到一个使用配置文件后的弊端:将很多密码等机密的东西暴露出来,比如:拿.Net项目来说,在服务器上发布好系统后,假如黑客攻陷服务器,如果使用配置文件则黑客很容易拿到数据库的密码等一些机密信息,如果是不用配置文件,这些信息是写在程序中,发布的文件是Dll,黑客想拿到不是那么容易;如果有这个顾虑的读者可以参考小编另外一篇博文—《SCPPO:IIS配置文件节点加密》。
4、友情提示:以上均为个人一些想法,如果大家有什么更多的想法,欢迎大家在评论中拍砖。
三、.Net & Java 读取配置文件的方式:
1、.Net读取配置文件的方式:
(1)配置文件的写法:
<configuration><appSettings><!--测试--><add key="Test" value="myTest"/></appSettings>
</configuration><span style="font-family:KaiTi_GB2312;font-size:18px;"> </span>
(2)项目公共类中读取配置文件的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Test.Common
{public class CommonConfigInfo{#region 从配置文件中读取Test节点-zhanghan-2016年10月5日/// <summary>/// 从配置文件中读取Test节点/// </summary>public static string Test{get{var Test = "myTest";if (!string.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["Test"])){Test = System.Configuration.ConfigurationManager.AppSettings["Test"];}return Test;}}}
}
(3)程序中使用使用该值:
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Test.Common;namespace Test.Web.Main.Controllers
{public class TestController : SessionsController{//测试从配置文件中读取节点-zhanghan-2016年10月5日public string mytest(){string test= CommonConfigInfo.Test;return test;} }
}
2、Java读取配置文件的方式(采用dom4j的方式):
(1)配置文件的写法:
<?xml version="1.0" encoding="UTF-8"?>
<config><db-info><driver-name>oracle.jdbc.driver.OracleDriver</driver-name><url>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</url><user-name>zhanghan</user-name><password>haha</password></db-info>
</config>
(2)为了方便操作将数据库连接的几个封装成一个类,并将ToString方法重写:
package com.test.util;/*** Jdbc相关配置* * @author zhanghan* */
public class JdbcConfig {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;}@Overridepublic String toString() {return this.getClass().getName() + "{driverName:" + driverName+ ",url:" + url + ",userName:" + userName + "}";}
}
(3)将dom4j文件放到WEB-INF目录下
(4)利用dom4j方式读取配置文件中的值,并存放到JdbcConfig类中(其中应用到了单例模式,并且将懒汉式和饿汉式两种都写出来,具体单例模式小编会在以后博文中为大家详细分析):
package test.util;import java.io.InputStream;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/*** 解析sys-config.xml文件* * @author zhanghan* */
public class XmlConfigReader {// 饿汉式(预先加载)// private static XmlConfigReader instance = new XmlConfigReader();//// private XmlConfigReader() {//// }//// public static XmlConfigReader getInstance() {// return instance;// }// 懒汉式(延迟加载)private static XmlConfigReader instance = null;private JdbcConfig jdbcConfig = new JdbcConfig();private XmlConfigReader() {SAXReader reader = new SAXReader();InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");try {Document doc = reader.read(in);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.setUrl(urlElt.getStringValue());jdbcConfig.setUserName(userNameElt.getStringValue());jdbcConfig.setPassword(passwordElt.getStringValue());} catch (DocumentException e) {e.printStackTrace();}}public static synchronized XmlConfigReader getInstance() {if (instance == null) {instance = new XmlConfigReader();}return instance;}/*** 返回Jdbc的相关配置* * @return*/public JdbcConfig getJdbcConfig() {return jdbcConfig;}
}
(5)程序中读取该值:
package com.test.util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** 数据操作* * @author zhanghan* */
public class DbUtil {/*** 取得Connection* * @return*/public static Connection getConnection() {Connection conn = null;try {// 固定死的// Class.forName("oracle.jdbc.driver.OracleDriver.class");// String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";// String username = "drp";// String password = "drp";//// conn = DriverManager.getConnection(url, username, password);// 从配置文件中读取JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();Class.forName(jdbcConfig.getDriverName());conn = DriverManager.getConnection(jdbcConfig.getUrl(),jdbcConfig.getUserName(), jdbcConfig.getPassword());} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}
}
【总结】
1、应用配置文件使得程序更加灵活可配,从而大大减少了运维人员的工作量;
2、不同阶段对一块儿知识的理解是不同的,随着经历的越多对同一个知识块儿理解越来越深刻;
3、多去思考,多去总结,知识体系会越来越完善。
SCPPO(二十二):读取配置文件---程序猿必不可少的技能相关推荐
- 实验二十二 SCVMM中的SQL Server配置文件
实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...
- 【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录
前面学习了ABI的知识,感觉受益良多.对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅. [软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 [ ...
- 程序员编程艺术第一 二十二章集锦与总结(教你如何编程)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员编 ...
- 程序员编程艺术第一~二十二章集锦与总结(教你如何编程)
程序员编程艺术第一~二十二章集锦与总结(教你如何编程) 作者:July.编程艺术室. 出处:http://blog.csdn.net/v_JULY_v . 题记 好久没更新博客了,虽只有一个月,但对我 ...
- 【白话设计模式二十二】解释器模式(Interpreter)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 2021年大数据Hadoop(二十二):MapReduce的自定义分组
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...
- 插入DLL和挂接API——Windows核心编程学习手札之二十二
插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...
- 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环
目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
最新文章
- linux-命令替换-通配符-重定向-管道
- 寻找凸包 (Convex Hull)
- [core]-ARM A76学习笔记
- python利用pandas和xlrd读取excel,特征筛选列
- 基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - A. 方程整数解
- [深度学习]自然语言处理 --- ELMo
- 硬货 - 技术人也能轻松玩转公众号?正确姿势竟然是...
- python练习_如何使用Logzero在Python中练习记录
- oracle+资料类型不一致吗,oracle数据库中,字段类型不一致,导致查询慢
- 数字图像处理 实验一 图像的基本运算
- 【笔试/面试】—— 奇葩 C/C++ 语法题(二)
- 深入理解机器学习(一)——二分类模型评价指标详解(上)
- js实现浏览器书签收藏
- 解决win10笔记本电脑无法睡眠只是黑屏问题的方法
- html怎么在图中加字,用HTML代码在图片上加字
- js利用数组创建图片对象
- 《C语言详解》_by_Hanly.学习笔记(1)
- 电脑中文件名称字体变颜色怎么解决,由黑色变成蓝色了。。。。。。
- Linux下查看显卡型号
热门文章
- 我们为什么要学习 Python、TypeScript 与 Go?
- 350 个在家办公的人,创造了估值 10 亿美元的代码共享平台
- 门前异动监控、AI 人脸识别!360 发布新型智能门铃
- nodejs和cnpm安装
- java 替换回车换行符
- 服务器 消息 208,在MSSQL2000里边 对象名 'sys.servers' 无效 服务器: 消息 208,级别 16,状态 1,行 1...
- 水桶平分 java_关于java:桶排序算法代码问题
- mysql 死锁 代码_MySQL死锁问题解决的代码详细介绍
- 怎么重置unity界面_请问itween如何重置?
- mysql safe 停止工作_mysql不明原因停止后不能启动,请高手分析