实战小技巧14:配置文件Properties

简介: properties配置文件,相信各位小伙伴都不会太陌生,常用Spring的可能会经常看到它,虽说现在更推荐的是使用Yaml配置文件,但是properties配置文件的使用频率也不低在jdk中有一个直接关连的类Properties,接下来我们来看一下它的用法

properties配置文件,相信各位小伙伴都不会太陌生,常用Spring的可能会经常看到它,虽说现在更推荐的是使用Yaml配置文件,但是properties配置文件的使用频率也不低


在jdk中有一个直接关连的类Properties,接下来我们来看一下它的用法


1. 配置文件



properties文件的格式比较简单


  • key = value: 等号左边的为配置key,右边的为配置value(value值会去除前后的空格)
  • #:以#来区分注释


一个基础的配置文件如下

# 测试
key = value
user.name = 一灰灰blog
user.age = 18
user.skill = java,python,js,shell
复制代码


2. 配置文件加载



对于Properties配置文件,我们可以非常简单的借助Properties类,来实现配置的加载


public class PropertiesUtil {
    /**
     * 从文件中读取配置
     *
     * @param propertyFile
     * @return
     * @throws IOException
     */
    public static Properties loadProperties(String propertyFile) throws IOException {
        Properties config = new Properties();
        config.load(PropertiesUtil.class.getClassLoader().getResourceAsStream(propertyFile));
        return config;
    }
}
复制代码


直接使用Properties#config就可以读取配置文件内容,并赋值到java对象


重点注意:


重点看一下Properties类的继承关系,它的父类是Hashtable, 也就是说它的本质是Map对象

public
class Properties extends Hashtable<Object,Object> {
}
复制代码


3. Properties对象使用



因为Properties是继承自Hashtable,而Hashtable是线程安全的Map容器,因此Properties也是线程安全的,同样的,在多线程并发获取配置的时候,它的性能表现也就不咋地了,why?


首先看一下配置获取

// 获取配置属性
public String getProperty(String key) {
    Object oval = super.get(key);
    String sval = (oval instanceof String) ? (String)oval : null;
    return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}
// 获取配置属性,如果不存在,则返回默认值
public String getProperty(String key, String defaultValue) {
    String val = getProperty(key);
    return (val == null) ? defaultValue : val;
}
复制代码


上面两个方法的使用频率很高,从签名上也很容易知道使用姿势;接下来需要看一下的为啥说并发效率很低


关键点就在第一个方法的super.get(),它对应的源码正是

public synchronized V get(Object key) {
  // ...
}
复制代码


方法签名上有synchronized,所以为啥说并发环境下的性能表现不会特别好也就知道原因了


除了获取配置之外,另外一个常用的就是更新配置

public synchronized Object setProperty(String key, String value) {
    return put(key, value);
}
复制代码


4. 小结



本文介绍的知识点主要是properties配置文件的处理,使用同名的java类来操作;需要重点注意的是Properties类属于Hashtable的子类,同样属于容器的范畴


最后提一个扩展的问题,在SpringBoot的配置自动装载中,可以将配置内容自动装载到配置类中,简单来讲就是支持配置到java bean的映射,如果现在让我们来实现这个,可以怎么整?



相关文章
|
开发框架 前端开发 .NET
Abp源码分析之Serilog日志
本文介绍了如何在ASP.NET Core MVC项目和ABP框架中配置和使用Serilog日志库。通过修改`Program.cs`文件,配置日志级别、输出目标,并在控制器和页面模型中记录日志。具体步骤包括新建MVC项目、配置日志、修改控制器和首页代码。最终,日志将被记录到控制台和`Logs/logs.txt`文件中。
244 1
Abp源码分析之Serilog日志
|
弹性计算 应用服务中间件 Linux
双剑合璧:在同一ECS服务器上共存Apache与Nginx的实战攻略
在ECS服务器上同时部署Apache和Nginx的实战:安装更新系统,Ubuntu用`sudo apt install apache2 nginx`,CentOS用`sudo yum install httpd nginx`。配置Nginx作为反向代理,处理静态内容及转发动态请求到Apache(监听8080端口)。调整Apache的`ports.conf`监听8080。重启服务测试,实现两者高效协同,提升Web服务性能。记得根据流量和需求优化配置。【6月更文挑战第21天】
1347 1
|
Kubernetes jenkins 持续交付
Kubernetes CI/CD 集成:持续交付的最佳实践
【8月更文第29天】随着微服务架构和容器化的普及,Kubernetes 成为了运行容器化应用的事实标准。为了确保应用能够快速迭代并稳定发布,持续集成/持续部署(CI/CD)流程变得至关重要。本文将介绍如何将 Kubernetes 集成到 CI/CD 流程中,并提供一些最佳实践。
863 1
|
编解码 并行计算 JavaScript
Nodejs 第十六章(ffmpeg)
Nodejs 第十六章(ffmpeg)
424 0
element table配合from实现双击可编辑表格
如何使用Element UI的el-table和el-form组件实现双击可编辑的表格。
421 0
|
运维 监控 安全
运维工程师的转型与升级:解析35岁半衰期现象及其应对策略
运维工程师的转型与升级:解析35岁半衰期现象及其应对策略
1270 1
|
算法 安全 Java
AES加解密算法:原理、应用与安全性解析
AES加解密算法:原理、应用与安全性解析
|
机器学习/深度学习 数据可视化 计算机视觉
【YOLOv8改进 - 注意力机制】Triplet Attention:轻量有效的三元注意力
**摘要:** 本文提出TripletAttention,一种轻量级的计算机视觉注意力机制,通过三分支结构增强跨维度交互。该方法利用旋转操作和残差变换在通道和空间维度上建立依赖,提升模型性能,同时保持低计算成本。作为附加模块,它能集成到现有骨干网络中,适用于图像分类及目标检测等任务。实验证实在ImageNet-1k、MSCOCO和PASCAL VOC上取得良好效果,并提供GradCAM可视化分析。代码已开源:[GitHub](https://github.com/LandskapeAI/triplet-attention)。
|
并行计算 Java 编译器
还在用线程池,这款虚拟线程,让你性能倍增
还在用线程池,这款虚拟线程,让你性能倍增
2547 1