引言:(引自: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