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的默认 ...
随机推荐
- selenium 动态元素的定位
对于有些元素每次点击都是动态的 即每次都是不一样的 对于这种元素我们可以采用与他相关的其他静态的元素定位 比如 iframe 这个元素的id是动态的 每次都在变化 第一种就是我们观察下 是整个都是 ...
- CF Educational Round 78 (Div2)题解报告A~E
CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students 依题意模拟即可 #include<bits/stdc++.h> us ...
- 如何更新GitHub上的代码?
更新github上的代码 一.克隆代码 1.先是把自己GitHub上的代码克隆到本地(下载到本地) 步骤1.随便创建一个新文件夹(用来存放下载下来的代码) 步骤2.在文件夹中打开cmd 输入下载指令下 ...
- pytest 打印调试信息
pytest_lean2.py #coding=utf- import pytest import os import sys import time import json sys.path.app ...
- Unchecked runtime.lastError: The message port closed before a response was received.
这是由于某个 Chrome 扩展程序造成的. 打开 chrome://extensions/,逐一关闭排查.我这边是由于“迅雷下载支持”这个扩展引起的,将其关闭即可.
- java 栈
package testjavapro; import java.util.*; public class testjava { static void showpush(Stack<Integ ...
- 深度学习之TCN网络
论文链接:https://arxiv.org/pdf/1803.01271.pdf TCN(Temporal Convolutional Networks) TCN特点: 可实现接收任意长度的输入序列 ...
- Java调用api使用企业邮箱账户发送邮件
package cn.ucmed.otaka.healthcare.rubik.common; import lombok.extern.slf4j.Slf4j; import javax.mail. ...
- [技术博客]阿里云签名机制字符串的C语言实现
[技术博客]阿里云签名机制字符串的C语言实现 问题描述见:阿里云签名机制 话不多说,上字符串函数转化函数代码 bool AlicloudRequest::sendV2Request() { if( q ...
- asp.net core api 跨域配置
项目前后端分离,前端请求接口例如使用axios发送请求时浏览器会提示跨域错误,需要后端配置允许接口跨域 配置步骤: 1.通过NuGet安装Microsoft.AspNetCore.Cors.dll类库 ...