如何定义多个context:property-placeholder配置?

  1. 如题,一般会有spring-mvc和spring两个xml配置,如果有好几个properties配置文件,那么是否在每个xml配置开头处都要引入(前提是xml配置用到这个配置项)?

  2. 如果我按层分类了properties文件,比如mvc用一个,service用一个,那么我是否可以只在service引入service的配置文件,在mvc只引入mvc的配置文件?如何做?定义多个property-placeholder是不行的。

  3. ${foo}或者@value("${foo}")是如何拿到值的?如何保证去拿时已经有值了?如何保证这种顺序?

阅读 9.7k
1 个回答

A1/A2:定义多个property-placeholder的方法见下面长文,这样就可以解决问题1/2。

A3:spring本身不会区分mvc和biz层的容器,两者组合为一个容器,存在继承关系,实例化发生在取值之前,spring的顺序机制保证了${foo}是可以拿到值的。

property-placeholder本质上是“一个”,且配置后全局可用。一般建议全局配置所有的,可定义一个入口spring配置,在入口配置处配置具有多个properties文件的property-placeholder,然后import导入各个模块的spring配置文件。这应该是比较优美且简单的解决方式,首先推荐。

但如果我们不按套路  走,需要搞独具特色的语义分拆配置,可以看看下面的说明,可采用结论给出的配置方式。

知识叨叨:
ignore-unresolvable单独使用来看是“是否忽视不存在的配置项”,不仅如此,经过测验,有一个隐含意思:是否还要扫描其他配置项:如果扫描到的为false,则会忽视后续的property-placeholder(如下面测试2,3)。

测试:
首先我们确保稳定的加载顺序(使用orderd,不使用的话应该是按配置spring的顺序,将下面这个,从左到右,但我们不应该依赖于这种顺序):
 

在applicationContext.xml中:
<context:property-placeholder location="classpath:config.properties" ignore-unresolvable="表格中第二列的值" order="1" />

在applicationContext2.xml中:
<context:property-placeholder location="classpath:config2.properties" ignore-unresolvable="表格中第三列的值" order="2" />

测试用例    applicationContext中ignore-unresolvable值    applicationContext2中ignore-unresolvable值    结果分析    总结
1    true    true    两个配置项都会加载,但会完全忽视配置项不存在的情况,不会抛出异常,如果prop是String,则赋值为”${foo}”,这个肯定是错误的。    业务正确,但出错后(少配了个配置项)不易发现
2    false    false    第二个配置项文件会被忽视,业务会出现错误    业务错误
3    false    true    第二个配置项文件会被忽视,业务会出现错误(同上)    业务错误
4    true    false    两个配置项都会加载,且会检查config.properties和config2.properties的配置项,是我们的首选。    完美解决,业务正确且会报错


结论:
第4种是最佳的!同理,如果有三个,那么依次配置ignore-unresolvable为true,true,false,只要保证最后的为false即可。
在applicationContext.xml中:
<context:property-placeholder location="classpath:config.properties" ignore-unresolvable="true" order="1" />
在applicationContext2.xml中:
<context:property-placeholder location="classpath:config2.properties" ignore-unresolvable="false" order="2" />

参考:
《关于<context:property-placeholder>的一个有趣现象》 http://www.iteye.com/topic/1131688
《Spring中Ordered接口简介》 http://www.cnblogs.com/fangjian0423/p/spring-Ordered-interface.html
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题