引言:(引自:http://openwebx.org/docs/autoconfig.html)

在一个应用中,我们总是会遇到一些参数,例如:

  • 数据库服务器IP地址、端口、用户名;

  • 用来保存上传资料的目录。

  • 一些参数,诸如是否打开cache、加密所用的密钥名称等等。

这些参数有一个共性,那就是:它们和应用的逻辑无关,只和当前环境、当前系统用户相关。以下场景很常见:

  • 在开发、测试、发布阶段,使用不同的数据库服务器;

  • 在开发阶段,使用Windows的A开发者将用户上传的文件存放在d:\my_upload目录中,而使用Linux的B开发者将同样的文件存放在/home/myname/my_upload目录中。

  • 在开发阶段设置cache=off,在生产环境中设置cache=on

很明显,这些参数不适合被“硬编码”在配置文件或代码中。因为每一个从源码库中取得它们的人,都有可能需要修改它们,使之与自己的环境相匹配

......

很多框架支持使用placeholder占位符替换配置文件中的参数,然后在运行期或者编译器读取properties文件,完成动态配置。最近刚好研究了几种使用占位符替换配置的方法,故在此做个比较和总结:

-------------------------我是分割线----------------------------

1.使用spring自带的实体类来配置参数

Spring的框架中为您提供了一个 BeanFactoryPostProcessor 的实作类别: org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。藉由这个类别,您可以将一些组态设定,移出至.properties档案中,如此的安排可以让XML定义档负责系统相关设定,而.properties档可以作为客户根据需求,自定义一些相关的参数。

    <!--参数配置,参数过滤,使用properties替换占位符 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config/spring-daily.properties</value>
</list>
</property>
</bean>

2.使用maven自带的build设置来实现参数过滤

这是通过在build节点中添加filter和resource来实现的,在<build>标签下有一个<filters>标签,用于定义指定filter属性的位置,例如filter元素赋值filters/filter1.properties,那么这个文件里面就可以定义name=value对,这个name=value对的值就可以在工程pom中通过${name}引用,默认的filter目录是${basedir}/src/main/fiters/

    <filters>
<filter>src/main/filters/filter-${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>

  

3.使用maven的插件maven-war-plugin来实现参数过滤

使用maven-war-plugin这个插件可以在执行打包命令的时候指定我要打哪个环境的包(具体方法不在这里展开讲),使用上比maven原生的filter机制要方便,功能也更强大

<filters>
<filter> src/main/resources/IProject-test.properties </filter>
</filters>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>src/main/packageFilter</directory>
<filtering>true</filtering>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>

4.使用AutoConfig插件来实现参数过滤

AutoConfig是一种类似于Maven Filtering的工具。是阿里开发的,一款功能强大的参数过滤插件,具体功能和使用方法不在这里展开讲,想要进一步了解的去这里:http://openwebx.org/docs/autoconfig.html

-------------------------我是分割线----------------------------

4种参数过滤方式的比较:

方法

优点

缺点

替换参数的时期

上手难度

功能性

Spring插件

速度快

配置简单

只能针对spring的bean起作用,其它配置内容无法过滤

运行时

Maven原生设置

Maven自带功能,不需要额外的插件

资源文件被复制到目标目录时才起作用

功能偏弱

build时

偏弱

maven-war-plugin插件

可以针对多套环境进行设置

覆盖原文件

配置灵活

满足大部分需求

缺少验证机制

Build时期才执行因此速度较慢

build时

AutoConfig插件

有验证机制;

功能强大

针对配置文件,不需要打包,因此不需要项目源代码文件

教程较少

上手较难

build时

最复杂

最强

参考资料:

http://www.cnblogs.com/qq78292959/p/3711501.html

http://lishuaibt.iteye.com/blog/614783

http://nileader.blog.51cto.com/1381108/449956

http://openwebx.org/docs/autoconfig.html

几种placeholder替换项目参数的方法比较的更多相关文章

  1. .net中常用的几种页面间传递参数的方法

    转自:http://www.cnblogs.com/lxshanye/archive/2013/04/11/3014207.html 参考:http://www.cnblogs.com/zhangka ...

  2. Hadoop创始人Doug Cutting寄语2017:五种让开源项目成功的方法

    原文链接:http://www.infoq.com/cn/news/2017/01/Hadoop-2017-5-open-source?utm_source=tuicool&utm_mediu ...

  3. Struts2中Action接收参数的方法主要有以下三种:

    Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数(最原始的方式):     a.定义:在Action类中定义属性,创建get和set方法:     b.接 ...

  4. 介绍一种很棒的wince 如何替换系统声音的方法

    Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy) //------------------------------------------------- ...

  5. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  6. 多浏览器兼容用javascript获取url参数的方法比较推荐的一种

    多浏览器兼容用javascript获取url参数的方法比较推荐的一种 <script language = javascript> function request(paras){ var ...

  7. jsp中四种传递参数的方法

    jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...

  8. (转)TestNG框架提供两种传入参数的方法:

    1.从testng.xml传入参数. 如果参数是一些简单的值,可以直接在testng.xml中定义.这也是最常用的一种. 可以在测试用例中给参数一个默认值.这样,即使在xml文件中没有这个变量,你的测 ...

  9. JavaScript三种方法获取地址栏参数的方法

    今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split(“?”)这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网上找到了两个很又简单 ...

随机推荐

  1. Spark之路 --- Scala IDE Maven配置(使用开源中国的Maven库)和使用

    为什么要使用Maven 摘自百度百科的介绍 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven 除了以程序构建能力为特色之外,还提 ...

  2. Eclipse开发JQuery环境设置(Spket)

     http://www.cnblogs.com/sayo/archive/2008/10/20/1315528.html   首先需要安装Spket.可以参阅我的这篇文章进行Spket的安装. 之后进 ...

  3. python--json & pickle 模块

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  4. 关于直接创建视图UITableViewController显示(初学)

    今天渣渣想直接创建一个UITableView视图作为根视图来用结果发现有警告,才明白TableView和view是不能直接作为根视图的,需要放在ViewController上.做个笔记详细了解下. 参 ...

  5. 获取Spring-boot系统环境变量方法

    public static ConfigurableApplicationContext context = null; public static void main( String[] args ...

  6. vsftp安装与配置

    配置参考:https://help.aliyun.com/knowledge_detail/5973912.html?spm=5176.776701992.0.0.3X2PB8 553 Could n ...

  7. Shell学习笔记 - 运算符

    一.Declare命令 1. 命令格式 declare [+/-] [选项] 变量名 其中: -: 给变量设定类型属性 +:取消变量的类型属性 2. 参数说明 -i:将变量声明为整型 -a:将变量声明 ...

  8. [改善Java代码]适时选择不同的线程池来实现

    Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供 ...

  9. .net 创建属于自己的log类

    实习到现在已经接近三个月了,由于是校企联合培养计划,所以没有工资,所幸公司对于我们这些实习生并没有什么要求,刚开始我还觉得要做点什么才能学得快,可是到了后来,发现公司安排给我们的任务并不紧要,也不算太 ...

  10. 参数请求post, get , delete中的基本使用(1)

    /// <summary> /// get 数据的时候可以采用此函数大部分功能 /// </summary> /// <param name="args&quo ...