(二)关于代码中的配置
2017-02-24 00:00
148 查看
上一篇中说到
目前的设计是,基本上除了定时器设置的变动,有可能会修改app-scheduling.xml和spring-servlet.xml文件外,其他的配置都在这个config.properties文件中了
这一篇就来说说这块是怎么做的,看config.properties文件。
1.关于logback的配置。
以前就写了这块的实现,参考这里。主要就是logback的配置没怎么变化,最多就是因为日志的名称不同和日志级别,修改config.properties。
2.关于配置文件的想法。
因为项目部署了很多个tomcat节点,有开发环境、测试环境、生产环境的区别,而生产环境又利用nginx做了不同模块的区分,部分服务的配置稍微有点改动,这时候在部署上线的时候很麻烦,经常要改动配置文件,刚好项目的其他模块,有别人用python做的,这个模块,有个配置文件config.py,里面就利用字典数组的形式来写配置,指定当前环境,就可以读取到对应的配置,于是脑洞大开,是否也可以做类似的配置。
于是在配置文件里加了一个参数curEnv表示当前环境,值设置为.dev或.test或.pro,对于通用的配置,不加后缀,专用的配置就加上对应的配置。比如一个配置apihost=1.2.3.4,因为项目大部分是在生产用,为了便于部署,我把测试环境的配置加上后缀apihost.test=5.6.7.8,默认curEnv=,没有值。这里需要看全局常量类Constants.java
这里,又有另外一个东西可以说,就是PropertiesConfiguration,这里用到commons-configuration,之所以用到这块,是为了让部分配置即时生效。以前用普通的properties,正常读取文件是没问题,但是当遇到部分参数需要即时生效的时候,就需要重启tomcat,有时候又不允许随便重启,就要到凌晨去重启,很麻烦,找到这个就可以实现立即生效。在配置文件config.properties里面有中文,所以先设置默认用UTF-8来读取文件。之后设置加载策略config.setReloadingStrategy(new FileChangedReloadingStrategy());就是文件改变的时候重新加载。
对于需要即时生效的常量,比如这个test.str,采取这种写法是可以实现我们的效果的,如果写成public static String TESTSTR = getString("test.str");是没用的,个人是这么想的,这个静态变量初始化之后,指向的就是最早使用的值,之后文件的改变,不会触发新的读取。而用方法的形式,每次触发的是getString这个方法,这个方法因为PropertiesConfiguration的管理会读取新值。
这个getString方法针对环境变量curEnv改造了一下,含有当前环境包含的配置,就返回,没有就返回默认的。
在这么做了之后,比如我生产环境就不设置了,就用默认的空,在开发环境就用.dev,在测试环境就用.test。基本上除了数据库的配置是在 applicationContext.xml 不好这么加后缀做区分,其他的都可以了。一般数据库的配置,我按照几个环境,就写几个块在config.properties,不用的时候用#注释。
再后来,部署不用自己做了,但是要打包给负责部署的人,每次都修改配置文件也是麻烦,所以就这么做,比如有3个环境,3套配置,就写3个config.properties,就是命名不一样,配置内容有点不一样,因为一般都在开发环境,所以开发环境的配置文件就命名为config.properties,测试的配置文件命名为config.test.properties,生产的命名为config.pro.properties,在打包的时候,删掉去他无用的配置,把测试或生产的配置文件重命名为config.properties,就可以了。
关于代码中的配置就讲完了。
目前的设计是,基本上除了定时器设置的变动,有可能会修改app-scheduling.xml和spring-servlet.xml文件外,其他的配置都在这个config.properties文件中了
这一篇就来说说这块是怎么做的,看config.properties文件。
1.关于logback的配置。
以前就写了这块的实现,参考这里。主要就是logback的配置没怎么变化,最多就是因为日志的名称不同和日志级别,修改config.properties。
2.关于配置文件的想法。
因为项目部署了很多个tomcat节点,有开发环境、测试环境、生产环境的区别,而生产环境又利用nginx做了不同模块的区分,部分服务的配置稍微有点改动,这时候在部署上线的时候很麻烦,经常要改动配置文件,刚好项目的其他模块,有别人用python做的,这个模块,有个配置文件config.py,里面就利用字典数组的形式来写配置,指定当前环境,就可以读取到对应的配置,于是脑洞大开,是否也可以做类似的配置。
于是在配置文件里加了一个参数curEnv表示当前环境,值设置为.dev或.test或.pro,对于通用的配置,不加后缀,专用的配置就加上对应的配置。比如一个配置apihost=1.2.3.4,因为项目大部分是在生产用,为了便于部署,我把测试环境的配置加上后缀apihost.test=5.6.7.8,默认curEnv=,没有值。这里需要看全局常量类Constants.java
//系统配置文件 private static PropertiesConfiguration config; private static String curEnv = ""; static{ try { config = new PropertiesConfiguration(); config.setEncoding("UTF-8"); config.load("config.properties"); config.setReloadingStrategy(new FileChangedReloadingStrategy()); curEnv = config.getString("curEnv"); } catch (ConfigurationException e) { logger.error("找不到配置文件", e); } } private static String getString(String key) { if(config.containsKey(key + curEnv)) { return config.getString(key + curEnv); } return config.getString(key); } public static String getTestStr() { return getString("test.str"); }
这里,又有另外一个东西可以说,就是PropertiesConfiguration,这里用到commons-configuration,之所以用到这块,是为了让部分配置即时生效。以前用普通的properties,正常读取文件是没问题,但是当遇到部分参数需要即时生效的时候,就需要重启tomcat,有时候又不允许随便重启,就要到凌晨去重启,很麻烦,找到这个就可以实现立即生效。在配置文件config.properties里面有中文,所以先设置默认用UTF-8来读取文件。之后设置加载策略config.setReloadingStrategy(new FileChangedReloadingStrategy());就是文件改变的时候重新加载。
对于需要即时生效的常量,比如这个test.str,采取这种写法是可以实现我们的效果的,如果写成public static String TESTSTR = getString("test.str");是没用的,个人是这么想的,这个静态变量初始化之后,指向的就是最早使用的值,之后文件的改变,不会触发新的读取。而用方法的形式,每次触发的是getString这个方法,这个方法因为PropertiesConfiguration的管理会读取新值。
这个getString方法针对环境变量curEnv改造了一下,含有当前环境包含的配置,就返回,没有就返回默认的。
在这么做了之后,比如我生产环境就不设置了,就用默认的空,在开发环境就用.dev,在测试环境就用.test。基本上除了数据库的配置是在 applicationContext.xml 不好这么加后缀做区分,其他的都可以了。一般数据库的配置,我按照几个环境,就写几个块在config.properties,不用的时候用#注释。
再后来,部署不用自己做了,但是要打包给负责部署的人,每次都修改配置文件也是麻烦,所以就这么做,比如有3个环境,3套配置,就写3个config.properties,就是命名不一样,配置内容有点不一样,因为一般都在开发环境,所以开发环境的配置文件就命名为config.properties,测试的配置文件命名为config.test.properties,生产的命名为config.pro.properties,在打包的时候,删掉去他无用的配置,把测试或生产的配置文件重命名为config.properties,就可以了。
关于代码中的配置就讲完了。
相关文章推荐
- 使用Capistrano向EC2部署Django代码--关于SSH相关的配置
- svn代码合并方式、Android中关于时间、Svn环境配置、eclipse多个插件安装
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
- 关于CY7C68013A在Keil中代码及数据地址配置的问题
- 关于自动化测试框架,所需代码技能,Java篇——参数配置与读取.
- 关于git 账户配置以及代码克隆的部分总结
- 关于禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项
- 3.Benchmark SQL 数据库测试工具代码——关于配置类
- zf-关于评价器的开关所在的配置文件,与代码如何修改。
- SSM里关于mysql主从配置代码层实现
- 关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
- 关于COPC后台配置的几个关键步骤及其事务代码
- 关于tomcat配置MyEclipse项目的配置代码
- 关于Java开发过程中质量提升-1代码格式配置
- Spring关于CORS跨域支持的全局配置(代码实战)
- 关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
- IOS中关于百度推送的一些配置代码和步骤
- 关于Servlet手动配置web.xml部分代码
- 使用Capistrano向EC2部署Django代码--关于SSH相关的配置
- 关于org-capture-templates配置代码的解释