Java 使用properties配置文件加载配置
一般我们不把数据库的配置信息写死在代码中。
写好代码后,编译、调试,成功后只把输出目录中的东西(jar包、.class文件、资源文件等)拷贝到服务器上,由运维来管理。服务器上是没有源文件的(.java文件),我们我们把数据库的配置信息写死在代码中,运维就不能修改数据库的配置了,如果要换服务器、要换数据库、要改数据库的密码了,运维是改不了的,只能由我们修改源码,重新编译、部署。
通常的做法是,把配置信息写在配置文件(文本文件)中,从配置文件中加载配置信息,这样运维就可以直接修改配置了,无需改动源码。
示例:
1、项目根目录下新建文件夹resource,右键标识为资源根目录

Source Root是源码的根目录,默认为src;
Test Source Root是调试的根目录,比如JUnit调试的根目录;
Resource Root是资源文件的根目录,常用来放置配置文件,也可以放置其他资源文件,比如新建子文件夹images,下面放置图片。
2、在resource下新建文件mysql.properties,内容如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
user=chy
password=abcd
3、在.java文件中获取配置信息
//从properties文件中加载数据库配置
Properties properties = new Properties();
FileInputStream inputStream = new FileInputStream("resource/mysql.properties"); //注意路径
properties.load(inputStream); String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String pwd=properties.getProperty("password"); Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, pwd); //....
运行,效果正常。
但是,还是有问题。
FileInputStream inputStream = new FileInputStream("resource/mysql.properties");
这种加载资源的方式是从原项目中加载资源的,不是从部署的项目(输出目录)中加载资源的,你把部署好的项目拷给运维,运行报错:找不到这个资源文件。
实际上,你不把resource文件夹标识为资源根目录,效果也是对的。因为是从原项目中加载的资源文件。
标识为Resource Root后,运行|调试时才会把这个目录复制到输出目录(部署目录)。
正确的做法:通过反射(Class对象)来加载资源文件
InputStream inputStream = 当前类的Class对象.getResourceAsStream("/mysql.properties");
获取当前类的Class对象,有3种方式:
(1)通过当前类的实例来获取Class对象
InputStream inputStream = this.getClass().getResourceAsStream("/mysql.properties"); //注意路径
getClass()是实例方法,只能通过对象来引用,不能通过类名来引用。
这种方式有个缺陷,因为使用的是this,所以这句代码所在的方法不能是静态的(static,类方法)。
当然,硬要写成静态方法也行:
InputStream inputStream = new test.Test().getClass().getResourceAsStream("/mysql.properties");
不使用this,而是new一个当前类的实例。
(2)通过当前类的class属性来获取Class对象
InputStream inputStream=Test.class.getResourceAsStream("/mysql.properties"); //每个类都有class属性
(3)通过Class.forName("全类名")来获取Class对象
InputStream inputStream=Class.forName("test.Test").getResourceAsStream("/mysql.properties"); //forName()里是当前类的全类名
路径问题
可以看到,这2种写法,资源文件的路径都是/开头,路径中并没有resource文件夹。
这2种都是从输出目录(部署目录)中加载资源文件。只有标识为Resource Root的文件夹run|debug时才会拷贝到输出目录|目录,拷贝时不拷贝资源根目录resource,直接把resource下的子文件、子文件夹拷贝到输出目录中项目的根目录下,所以路径以/开头,/表示项目的根目录。
Java 使用properties配置文件加载配置的更多相关文章
- java的自定义配置文件统一读取配置类示例
前言:在我们的日常编程中难免会有些我们自定义的配置,虽然Java中提供了很多的读取配置文件的方法,但是当我们需要修改配置文件的key的时候,就会发现太过散乱了,工作量也会很大,涉及的文件还很多,一不小 ...
- Java之JDBC 通过加载properties配置文件连接数据库
通常情况下,我们通过JDBC连接数据库的时候,不会将数据库相关配置写死,因为到时候数据库一有改动,就要重新打包部署到服务器或者替换相关的.class文件,这样非常不灵活.因此,咱们一般会通过读取配置文 ...
- SpringMVC加载配置Properties文件的几种方式
最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定.URL映射的文章都很多了,写这篇博客主要总结一下 ...
- springboot的yaml基础语法与取值,配置类,配置文件加载优先级
1.基本语法k:(空格)v:表示一对键值对(一个空格必须有):以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是同一个层级的属性和值也是大小写敏感: server: port: 8081 pat ...
- SpringBoot——配置文件加载位置及外部配置加载顺序
声明 本文部分转自:SpringBoot配置文件加载位置与优先级 正文 1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者applic ...
- Eclipse+Tomcat实现热部署/热加载配置,修改java代码无需重启tomcat
一.Tomcat热加载配置 Eclipse Package Explorer中找到Servers,点击你所需要运行的tomcat的config配置文件,例如 demo-config,双击该文件夹下的s ...
- Unity3d通用工具类之数据配置加载类-ini配置文件加载
Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...
- Java 读取 .properties 配置文件的几种方式
Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 DOM 或 SAX 方式解析,而读取 properties 配 ...
- SpringBoot系列之配置文件加载位置
SpringBoot系列之配置文件加载位置 SpringBoot启动会自动扫描如下位置的application.properties或者application.yml文件作为Springboot的默认 ...
随机推荐
- python接口自动化框架
接口测框架 安装教程 需要3.5及以上版本的python pip install -r requirements.txt 使用说明 运行manage.py创建项目 创建的项目在projects目录下 ...
- 网页网站基础入门篇: 使用Adobe Dreamweaver CS6 制作网页/网站
咱开发网页或者网站呢,最好使用个软件,我使用的是Adobe Dreamweaver CS6 (自行下载安装) 打开软件 现在呢咱使用 html5 <!doctype html> <h ...
- LOJ2507 CEOI2011 Matching
题目链接 参考了 神仙yyb的博客 现在发现kmp不仅能匹配字符串,还可以用于处理任意模式匹配中的状态,如这题中已经匹配的序列中的数的大小关系就是一种状态,使用kmp找到模式序列的每一个前缀的bord ...
- 何为pc值
PC就是程序计数器,就是指挥程序从哪里执行.如果是8位机,每个存储单元存放一个字节,指令有单字节.双字节和3字节.单片机复位时,PC=0000H,而后每执行一条指令,PC根据指令的字节数增加,如图:最 ...
- 搭建Hadoop+Python的大数据开发环境
实验环境 CentOS镜像为CentOS-7-x86_64-Everything-1804.iso 虚机配置 节点名称 IP地址 子网掩码 CPU/内存 磁盘 安装方式 master 192.168. ...
- 紧随时代的步伐--Java8特性之接口默认方法
1.关于Java8 自从1996年Sun公司发布Java以来,Java到目前为止已经走过21个年头,每一次的升级,都是Java语言的革新,对时代发展的适应.2014年Oracle发布Java8,而据可 ...
- VUE:页面跳转时传递参数,及参数获取
https://www.cnblogs.com/zhongchao666/p/9679807.html https://blog.csdn.net/mf_717714/article/details/ ...
- 利用ffmpeg获取视频帧
如果要对视频帧进行处理,可以先把视频帧读取出来. sh文件代码如下: #!/usr/bin/env sh VIDEO=/home/xxx/video/ FRAMES=/home/xxx/frame/ ...
- 【发现】visualvm是jdk自带的一款监控工具
visualvm是jdk自带的一款监控工具.它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息.VisualVM 对 Java Development Kit ...
- 发现一个企业微信第三方应用开发的疑似BUG
1.企业微信两个账号A(超级管理员),账号B(分级管理员),账号B具有创建应用与小程序权限.2.账号B添加一个第三方应用后(创建后能看到第三方应用),使用下图接口登录时回调的agent一直为空,3.超 ...