Spring集成多个资源文件加载问题

Spring集成多个资源文件加载问题

异常代码

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'redis.port' in value "${redis.port}"


 

配置文件结构

 Spring集成多个资源文件加载问题_第1张图片


Spring-redis.xml 文件


	
	 
		
	
	
		
		
		
	


 

Spring-jdbc.xml 配置文件


	
	 
	
    
        
        
        
        
       


 

问题原因

Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了)。
这个基于命名空间的配置,其实内部就是创建一个PropertyPlaceholderConfigurer Bean而已。换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或),其余的会被Spring忽略掉(其实Spring如果提供一个警告就好了)。

 

修改配置文件,问题解决

 


 

或者

    
          
              
                                    classpath*:properties/jdbc.properties  
                  
              
               
             
          
              
                                classpath*:properties/redis.properties  
                  
              
               
          


 

 

问题补充:

1、PropertyPlaceholderBeanDefinitionParser的父类中shouldGenerateId返回true,即默认会为每一个bean生成一个唯一的名字; 如果使用了两个
2、PropertySourcesPlaceholderConfigurer本质是一个BeanFactoryPostProcessor,spring实施时如果发现这个bean实现了Ordered,则按照顺序执行;默认无序;

3、此时如果给比如
   order="2"
 location="classpath*:conf/conf_a.properties"/> 
   order="1" location="classpath*:conf/conf_b.properties"/>

此时会先扫描order='1' 的,如果没有扫描order='2'的

4、默认情况下ignore-unresolvable;即如果没找到的情况是否抛出异常。默认false:即抛出异常;
ignore-unresolvable="false"/>

 

参考地址:http://www.iteye.com/topic/1131688

http://xingguangsixian.iteye.com/blog/2088618

 

你可能感兴趣的:(开发常见错误与环境配置问题)