几种placeholder替换项目参数的方法比较
引言:(引自: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替换项目参数的方法比较的更多相关文章
- .net中常用的几种页面间传递参数的方法
转自:http://www.cnblogs.com/lxshanye/archive/2013/04/11/3014207.html 参考:http://www.cnblogs.com/zhangka ...
- Hadoop创始人Doug Cutting寄语2017:五种让开源项目成功的方法
原文链接:http://www.infoq.com/cn/news/2017/01/Hadoop-2017-5-open-source?utm_source=tuicool&utm_mediu ...
- Struts2中Action接收参数的方法主要有以下三种:
Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数(最原始的方式): a.定义:在Action类中定义属性,创建get和set方法: b.接 ...
- 介绍一种很棒的wince 如何替换系统声音的方法
Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy) //------------------------------------------------- ...
- 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的返回值自动进行各种序列化处理(序列化为 ...
- 多浏览器兼容用javascript获取url参数的方法比较推荐的一种
多浏览器兼容用javascript获取url参数的方法比较推荐的一种 <script language = javascript> function request(paras){ var ...
- jsp中四种传递参数的方法
jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...
- (转)TestNG框架提供两种传入参数的方法:
1.从testng.xml传入参数. 如果参数是一些简单的值,可以直接在testng.xml中定义.这也是最常用的一种. 可以在测试用例中给参数一个默认值.这样,即使在xml文件中没有这个变量,你的测 ...
- JavaScript三种方法获取地址栏参数的方法
今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split(“?”)这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网上找到了两个很又简单 ...
随机推荐
- ASP.NET MVC 之 路由配置
主要操作在App_Start 目录下的 RouteConfig.cs 文件. 一.Url构造方式 1.命名参数规范+匿名对象 routes.MapRoute( name: "Default& ...
- 【单峰函数,三分搜索算法(Ternary_Search)】UVa 1476 - Error Curves
Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a m ...
- poj 2057 树形dp 贪心
思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫. #include<iostream> #in ...
- EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法
最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json , 要想忽略的属性前面添加特性 ...
- ActiveMQ(5.10.0) - 删除闲置的队列或主题
方法一 通过 ActiveMQ Web 控制台删除. 方法二 通过 Java 代码删除. ActiveMQConnection.destroyDestination(ActiveMQDestinati ...
- HTTP - Session 机制
HTTP 是种无状态的协议,即使用 HTTP 协议时,每次发送请求都会产生对应的新响应,协议本身不会保留之前一切的请求或响应报文的信息.这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTT ...
- JavaScript之可运行按钮
看到好多大神都写了像这种在页面"可运行"的Javascript脚本,感觉很好奇,所以我今天也试着写了一个. 自从有了这个"可运行"按钮,好多代码就再也不以图片的 ...
- ALTER---删除字段
ALTER TABLE table_name DROP (column1,column2,...); 例: ALTER TABLE userinfo DROP (name,num); 说明: 1.or ...
- Objective-C 【单个对象内存管理(野指针&内存泄露)】
------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...
- 直接拿来用,最火的.NET开源项目(beta)
转自:http://blog.csdn.net/ltylove2007/article/details/18656971 综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面 ...