ResourceBundle类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。
properties
1.ResourceBundle的常用方法:
1.1根据资源文件path加载资源
String sourcePath = "XXXXX.properties"
ResourceBundle resourceBundle = ResourceBundle.getBundle(sourcePath);
1.2获取资源文件中所有的key
Enumeration<String> keys = resourceBundle.getKeys();
1.3根据key读取对应的value值
String value = resourceBundle.getString(key);
使用场景
ResourceBundle已经给我们提供了通过key获取value的方法,相对来说比较方便。如果我们需要获取配置文件中的用户名,则如下代码就可以实现。
String userName= resourceBundle.getString("userName");
但是假设配置属性很多时,我们就需要重复写很多这样的荣誉代码,有没有适合Java编程思想里面的好的方式,将这些属性映射到java对象中,然后我们自己从java对象中获取嗯?
这里我们可以通过反射的手段将properties的属性值的key和java对象的属性字段进行匹配,如果配置文件的key值等于对象的属性字段,则将key对应的value映射到java对象的字段的属性上。
2.代码实现
2.1代码结构如下
2.2database.properties
##驱动名称:不推荐com.mysql.jdbc.Driver,而是推荐使用com.mysql.cj.jdbc.Driver
driverName = com.mysql.cj.jdbc.Driver
##数据库连接地址
url = jdbc:mysql://127.0.0.1:3306/testdb
userName = root
passWord = root
##连接池名字
poolName = Hutao Connection Pool
##空闲池,最小连接数
minConnections = 1
##空闲池,最大连接数
maxConnections = 10
##初始化连接数
initConnections = 5
##重复获得连接的频率 一秒
connTimeOut = 1000
##最大允许的连接数,和数据库对应
maxActiveConnections = 100
##连接超时时间,默认20分钟 1000 * 60 * 20
connectionTimeOut = 1200000
2.2DbProperties对象
该对象的所有属性名称和配置文件中的key保持一致
/**
* @Description:数据库连接池属性信息
* @author hutao
* @mail hutao_2017@aliyun.com
* @date 2020年07月08日
*/
public class DbProperties {
/* 链接属性 */
private String driverName;
private String url;
private String userName;
private String passWord;
private String poolName;
/**
* 空闲池,最小连接数
*/
private int minConnections;
/**
* 空闲池,最大连接数
*/
private int maxConnections;
/**
* 初始连接数
*/
private int initConnections;
/**
* 重试获得连接的频率 毫秒
*/
private long connTimeOut;
/**
* 最大允许的连接数
*/
private int maxActiveConnections;
/**
* 连接超时时间
*/
private long connectionTimeOut;
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;
}
public String getPoolName() {
return poolName;
}
public void setPoolName(String poolName) {
this.poolName = poolName;
}
public int getMinConnections() {
return minConnections;
}
public void setMinConnections(int minConnections) {
this.minConnections = minConnections;
}
public int getMaxConnections() {
return maxConnections;
}
public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}
public int getInitConnections() {
return initConnections;
}
public void setInitConnections(int initConnections) {
this.initConnections = initConnections;
}
public long getConnTimeOut() {
return connTimeOut;
}
public void setConnTimeOut(long connTimeOut) {
this.connTimeOut = connTimeOut;
}
public int getMaxActiveConnections() {
return maxActiveConnections;
}
public void setMaxActiveConnections(int maxActiveConnections) {
this.maxActiveConnections = maxActiveConnections;
}
public long getConnectionTimeOut() {
return connectionTimeOut;
}
public void setConnectionTimeOut(long connectionTimeOut) {
this.connectionTimeOut = connectionTimeOut;
}
@Override
public String toString() {
return "DbProperties [driverName=" + driverName + ", url=" + url + ", userName=" + userName + ", passWord="
+ passWord + ", poolName=" + poolName + ", minConnections=" + minConnections + ", maxConnections="
+ maxConnections + ", initConnections=" + initConnections + ", connTimeOut=" + connTimeOut
+ ", maxActiveConnections=" + maxActiveConnections + ", connectionTimeOut=" + connectionTimeOut + "]";
}
}
/**
* @Description:数据库连接池管理
* @author hutao
* @mail hutao_2017@aliyun.com
* @date 2020年07月08日
*/
public class DbPoolManager {
private static String sourcePath = "com/hutao/resources/database";
/**
* 数据库连接池配置属性
*/
private static DbProperties properties = null;
/**
* 双重检查机制
*/
static {
try {
if(properties == null) {
synchronized(DbPoolManager.class) {
if(properties == null) {
properites2Object();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Description:数据库连接池database配置文件映射到java对象
* @author hutao
* @mail hutao_2017@aliyun.com
* @date 2020年07月08日
*/
private static void properites2Object() throws NoSuchFieldException, IllegalAccessException {
properties = new DbProperties();
ResourceBundle resourceBundle = ResourceBundle.getBundle(sourcePath);
//获取资源文件中所有的key
Enumeration<String> keys = resourceBundle.getKeys();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
//反射获取类中的属性字段
Field field= DbProperties.class.getDeclaredField(key);
//属性字段的类型
Type genericType = field.getGenericType();
//属性设置可访问
field.setAccessible(true);
//根据key读取对应的value值
String value = resourceBundle.getString(key);
if("int".equals(genericType.getTypeName())) {
//反射给属性赋值
field.set(properties, Integer.parseInt(value));
}else if("long".equals(genericType.getTypeName())) {
field.set(properties, Long.parseLong(value));
}else if("java.lang.String".equals(genericType.getTypeName())) {
field.set(properties,value);
}
}
}
}
演示效果