摘要:本文深入探讨了配置化文件(即.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. 控制器中的Action方法,接收浏览器传过来的参数,总共有几种?

    1.根据配置文件中的URL规则 public ActionResult Delete(int id) //id参数就是根据路由里面的参数id来传过来的,这个action方法中的参数一定要和路由中的id ...

  2. C# WinFrom 跨线程访问控件

    1.跨线程访问控件委托和类的定义 using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summ ...

  3. Sql订阅发布注意事项

    1.做订阅发布的2台Sql服务器最好要版本一致,不能出现类似如下情况: Sql2008 R2[发布] - Sql2008[订阅]: Sql2008 R2[发布] - Sql2012[订阅] 2.订阅发 ...

  4. Python基础:序列(字符串)

    一.概述 字符串 类似于C中的字符数组(功能上更像C++中的string),它是由一个个 字符 组成的序列.与C/C++不同的是,Python中没有 字符 这个类型,而是用 长度为1的字符串 来表示字 ...

  5. C#继承基本控件实现自定义控件

    C#继承基本控件实现自定义控件 摘自:http://www.cnblogs.com/greatverve/archive/2012/04/25/user-control-inherit.html 自定 ...

  6. Maven初步搭建 (一)

    什么是maven? 也许很多人开始的时候跟我一样,在看了很多工程之后都不知道这个鸟东西到底是用来干嘛用的!:-D 一个东西之所以会出现是有其原因的,譬如Linus大神写git. Maven项目对象模型 ...

  7. PHP系列之一traits的应用

    Traits 在PHP中实现在方法的重复使用:Traits与Class相似,但是它能够在Class中使用自己的方法而不用继承: Traits在Class中优先于原Class中的方法,引用PHP Doc ...

  8. Ahjesus获取自定义属性Attribute或属性的名称

    1:设置自己的自定义属性 public class NameAttribute:Attribute { private string _description; public NameAttribut ...

  9. PHP 操作socket 实现简易聊天室

    <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP ); socket_bind($socket ,'127.0.0.1', ...

  10. jquery重置html form

    很多时候在ajax提交或者对话框隐藏之后,我们希望重置默认值以便下次打开对话框时保持干净. 因为jquery选择器返回的是list,并且没有对此提供reset方法,所以需要针对单个元素进行reset. ...