最近发现不能多个context:property-placeholder来注入properties文件:
项目Common (通用项目)
config.properties
spring.xml (注入config.properties文件, 通过${xxxx}来注入bean属性 )
项目SpringData(数据层)
database.properties
springdata.xml (注入database.properties文件,通过${xxxx}来注入bean 属性)
项目Web (引用SpringData与Common项目)
web.properties
spring-mvc.xml ( 引用Common项目的spring.xml 和SpringData项目的springdata.xml )
<pre>
<import location="classpath:spring.xml" />
<import location="classpath:springdata.xml" />
</pre>
问题:
加载Web项目时会提示Could not resolve placeholder 'xxx.yyy' in string value "${xxx.yyy}"
查看日志,没有发现应该要加载properties文件被加载,而只加载了common项目下的config.properties文件
按照Web项目配置文件spring-mvc.xml
先import Common项目spring.xml文件
后import SpringData项目springdata.xml文件
的顺序,只加载了config.properties文件,后面的都被忽略掉。
找了一下资料:
http://www.iteye.com/topic/1131688
https://segmentfault.com/q/1010000006823872
发现第一个第二个properties文件(Common/spring.xml和SpringData/database.properties)
需要设置ignore-unresolved=true,第三个文件(Web/config.properites)才会被加载,这个ignore-unresolved属性就好像html dom模型里的冒泡事件一样,每触发一次事件都由这个事件来决定事件消息是否冒泡传递到上一级。
但这种方式有可能出现加载顺序混乱的情况,所以使用以下方式最好:
Common/Spring.xml 不再注入config.properties文件
SpringData/SpringData.xml 不再注入database.properties文件
所有的properties加载由web/spring-mvc.xml 来统一注入:
<pre>
<context:property-placeholder
location="classpath:config.properties,classpath:database.properties,classpath:web.properties" />
<import location="classpath:spring.xml" />
<import location="classpath:springdata.xml" />
</pre>
这样就很好的告诉给spring容器应该加载什么文件,以及加载顺序。