摘要:本文深入探讨了配置化文件(即.properties)的普遍应用方式。包括了Spring、一般的、远程的三种使用方案。

关键词:.properties, Spring, Disconf, Java

解决问题:如何正确使用.properties配置文件。


    
    若是有其他代码需要此Spring属性配置,将Spring配置中的属性值设置迁移到外部的属性文件中,是必需的操作,这也可以使Spring配置文件更易读。在这里我们不仅要讨论Spring的外部化配置,还要深入探讨配置化文件(即.properties)的普遍应用方式。这样就可以在不用重新打包和重新部署应用的情况下,配置这些属性值。从开发过程来看,将通用变量提出,并可配,也是写出高可读、低耦合代码的必然途径。从结果来看,这对于灵活性地进行测试、运维工作,是非常有好处的。在开发时,我们尽量把部署时需要修改的信息提出放在文件中,方便部署人员部署。一个大型系统中,多个项目有相同的配置信息,则部署人员部署时需要对多个不同的文件修改相同的信息,这不是好的代码结构,麻烦部署人员的同时,也增加了犯错的可能性。下面,就是针对以上问题的解决方案。
 
一、原先的Spring配置
 
    下面是普通的Spring配置文件。可以看出,这里的value可以提出,以供其它代码重用。
 
<bean id="IndexHandler" name="IndexHandler" class="wang.anqi.util.IndexHandler">
        <property name="solrUrl" value="http://192.8.125.30:8983/solr/core0"/>
</bean>
 
 
二、经过改良后的配置
 
1、Spring配置
 
    下面是引入了两个配置文件db.properties和solr.properties后的Spring配置文件。
 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:db.properties</value>
                <value>classpath:solr.properties</value>
            </list>
        </property>
</bean>
<bean id="IndexHandler" name="IndexHandler" class="wang.anqi.util.IndexHandler">
        <property name="solrUrl" value=${solr.url}/>
</bean>
 
    以下是配置文件db.properties
 
db.ip = 192.8.125.201
db.name = aitanjupt
db.url = jdbc:mysql://${db.ip}:3306/${db.name}
db.username = root
db.password = 1234
 
    配置文件solr.properties
 
solr.url = http://192.8.125.30:8983/solr/core0
 
 
2、使用@Value注解来获取配置
 
    属性占位符配置的作用不限于XML中的Bean属性配置。还可以用它来配置@Value注解的属性。
 
public class IndexHandler
{
    @Value("${solr.url}")
    private String solrUrl;
}
 
 
    然而这种方式使用起来并不十分方便。你需要先在类里面申明一个属性。
 
3、使用ResourceBundle来读取配置
 
  1. privatestaticString myValue;
    static{
    try{
    ResourceBundle bundle =ResourceBundle
    .getBundle(PROPERTIES_FILE_NAME,Locale.ENGLISH);//PROPERTIES_FILE_NAME可以是solr.properties文件名的一部分:"solr"
    myValue = bundle.getString(MY_VALUE_KEY).trim();//MY_VALUE_KEY可以是solr.url
    }
    catch(Exception ex){
    System.err.println("[Property]:Can't Load property.properties");
    myValue ="default value";
    System.out.println("myValue will use the default value: "+ myValue);
    }
    }
  2. 这种方式使用起来比较方便。

 
三、远程读取配置文件
 
    只是通过以上方式来管理配置,尚觉不足。在一个比较大的系统中,很有可能多个子系统都需要使用相同配置的情况,当然,你可以将这些配置记入数据库中并提供接口,自己管理起来。但是如果需要实时地将配置信息推送到不同的子系统中,情况就更将复杂了。
    可以采用Disconf作为分布式配置管理平台,Disconf是一套完整的基于zookeeper的分布式配置统一解决方案。支持配置(配置项+配置文件)的分布式化管理,配置发布统一化,极简的使用方式(注解式编程 或 XML代码无代码侵入模式),低侵入性或无侵入性、强兼容性,需要Spring编程环境。其依赖于:Mysql、Tomcat、Nginx、zookeeeper、Redis。
   Disconf的缺陷在于安全问题,无需帐号登陆就可以下拉、下载各Properties。
    更多详细介绍请移步 https://github.com/knightliao/disconf
 
 
 

Spring配置文件外部化配置及.properties的通用方法的更多相关文章

  1. Spring Boot 外部化配置(一)- Environment、ConfigFileApplicationListener

    目录 前言 1.起源 2.外部化配置的资源类型 3.外部化配置的核心 3.1 Environment 3.1.1.ConfigFileApplicationListener 3.1.2.关联 Spri ...

  2. Spring Boot 外部化配置(二) - @ConfigurationProperties 、@EnableConfigurationProperties

    目录 3.外部化配置的核心 3.2 @ConfigurationProperties 3.2.1 注册 Properties 配置类 3.2.2 绑定配置属性 3.1.3 ConfigurationP ...

  3. Spring Boot外部化配置实战解析

    一.流程分析 1.1 入口程序 在 SpringApplication#run(String... args) 方法中,外部化配置关键流程分为以下四步 public ConfigurableAppli ...

  4. 曹工谈Spring Boot:Spring boot中怎么进行外部化配置,一不留神摔一跤;一路debug,原来是我太年轻了

    spring boot中怎么进行外部化配置,一不留神摔一跤:一路debug,原来是我太年轻了 背景 我们公司这边,目前都是spring boot项目,没有引入spring cloud config,也 ...

  5. Dubbo 新编程模型之外部化配置

    外部化配置(External Configuration) 在Dubbo 注解驱动例子中,无论是服务提供方,还是服务消费方,均需要转配相关配置Bean: @Bean public Applicatio ...

  6. 玩转Spring Boot 自定义配置、导入XML配置与外部化配置

    玩转Spring Boot 自定义配置.导入XML配置与外部化配置       在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...

  7. SpringBoot 正式环境必不可少的外部化配置

    前言 <[源码解析]凭什么?spring boot 一个 jar 就能开发 web 项目> 中有读者反应: 部署后运维很不方便,比较修改一个 IP 配置,需要重新打包. 这一点我是深有体会 ...

  8. SpringBoot官方文档学习(二)Externalized Configuration(外部化配置)

    Spring Boot允许您将配置外部化,以便可以在不同的环境中使用相同的应用程序代码.您可以使用属性文件.YAML文件.环境变量和命令行参数来具体化配置.属性值可以通过使用@Value注释直接注入b ...

  9. 关于SpringBoot的外部化配置使用记录

    关于SpringBoot的外部化配置使用记录 声明: 若有任何纰漏.错误请不吝指出! 记录下使用SpringBoot配置时遇到的一些麻烦,虽然这种麻烦是因为知识匮乏导致的. 记录下避免一段时间后自己又 ...

随机推荐

  1. ThroughRain第一次冲刺个人总结

    团队名:ThroughRain 项目确定:<餐厅到店点餐系统> 项目背景:本次项目是专门为餐厅开发的一套订餐系统.大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座 ...

  2. nopcommerce3.5源代码及中文语言包下载地址

    nopcommerce3.5源代码下载地址 http://download-codeplex.sec.s-msft.com/Download/SourceControlFileDownload.ash ...

  3. 改造一下C# Substring()函数

    C#的Substring()函数中,如果我们一不小心输入一个截取长度大于字符串的长时,就会收到一个异常:startIndex cannot be larger than length of strin ...

  4. display:inline-block兼容ie6/7的写法

    2.display:inline-block作用? 使用display:inline-block属性,可以使行内元素或块元素能够变成行内块元素,简单直白点讲就是不加float属性就可以定义自身的宽.高 ...

  5. 004_URL 路由 - URL 路由

    在Web Form 情况下,每一个 ASPX页面既是一个文件,又是一个队请求自包含的响应.而在 MVC 情况下,请求是由控制器类中的动作方法处理的,而且与硬盘上的文件没有一对一的相互关系. ASP.N ...

  6. WPF,给颜色SolidColorBrush添加动画

    /// <summary> /// 设置颜色动画 /// </summary> /// <returns></returns> private Soli ...

  7. 【Asphyre引擎】学习笔记(二)

    转一篇火人论坛那边的一份学习文档,我简单排一下版,希望对入门者有帮助. 感谢China Yang,这份文档也帮助我快速入了门. 和我一起学 Asphyre Sphinx Framework v1.0. ...

  8. ahjesus mongodb指定到数据盘连接不上的解决方案

    关于配置路径指定到数据盘会出现连接不上的情况 我发现是因为数据盘权限不足引起的,目前没找到治本的方法 有个治标的方法就是设置数据盘的权限和用户 sudo chmod 777 * -R  /path/d ...

  9. 【背景建模】VIBE

    ViBe是一种像素级的背景建模.前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新.在无法确定像素变化的模型时,随机的更新策略,在一定程度上可 ...

  10. sqlserver 死锁原因及解决方法

    其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它 ...