Spring中PropertyPlaceholderConfigurer替换占位符的问题

简介: Spring中PropertyPlaceholderConfigurer替换占位符的问题

1问题

多个Maven项目聚合的时候,每个maven都有自己的配置文件,并且都用了PropertyPlaceholderConfigurer替换占位符,然后启动的时候一直报错,说替换失败;问题症结就是 spirng配置多个PropertyPlaceholderConfigurer的问题

2原因

在spring bean装配时,一个PropertyPlaceholderConfigurer就是一个后置处理器BeanFactoryPostProcessor。在装配完PropertyPlaceholderConfigurer之后,就会触发org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor>, ConfigurableListableBeanFactory)方法,代码如下:

/**
* Invoke the given BeanFactoryPostProcessor beans.
*/
private void invokeBeanFactoryPostProcessors(
       Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {

   for (BeanFactoryPostProcessor postProcessor : postProcessors) {
       postProcessor.postProcessBeanFactory(beanFactory);
   }
}

假设一下,你配置了两个PropertyPlaceholderConfigurer实例 A模板的jdbc.xml配置文件

<beanid="propertyConfigurer"class="com.zheng.common.plugin.EncryptPropertyPlaceholderConfigurer">
       <propertyname="locations">
           <list>
               <value>classpath:jdbc.properties</value>
               <value>classpath:redis.properties</value>
           </list>
       </property>
   </bean>

B模板的shiro.xml配置文件

   <context:property-placeholderlocation="classpath*:zheng-upms-client.properties"/>

然后A模板中的jdbc.properties 和 B中的zheng-upms-client.properties 文件都在A模板中; A依赖了B;启动A项目,IOC会先实例化这两个配置的PropertyPlaceholderConfigurer; 假如先实例化了A中的PropertyPlaceholderConfigurer实例,那么它会去替换所有被标记为 ${} 的占位符,这个时候替换到B模板中的一些占位符之后,肯定就会报错了,因为B模板中的占位符是在 zheng-upms-client.properties这个属性文件中;

3解决方案

4一、使用一个PropertyPlaceholderConfigurer实例加载

<beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <propertyname="locations">
           <list>
               <value>classpath:jdbc.properties</value>
               <value>classpath:redis.properties</value>
                <value>classpath:zheng-upms-client.properties</value>
           </list>
       </property>
   </bean>

但是这样解决真的是超级没有诚意了,本来就是解决不通模块之间的问题啊

5二、配置加载顺序,并设置替换失败不报错

1.让B中的实例配置order=1 先加载,并且设置ignore-unresolvable="true"表示替换失败不报错

   <context:property-placeholderorder="1"ignore-unresolvable="true"location="classpath*:zheng-upms-client.properties"/>

2.设置A中,order=2 表示后加载,但是不设置ignore-unresolvable属性,因为最后还是要检查是否有剩余未替换的属性

   
   <beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <propertyname="order"value="2" />
       <propertyname="locations">
           <list>
               <value>classpath:jdbc.properties</value>
               <value>classpath:redis.properties</value>
           </list>
       </property>
   </bean>

6总结

思路就是 当有多个实例的时候,让他们一个一个的去替换,替换失败不提示错误,等做后一个实例替换的时候如果还有没有被替换的就提示错误! 所以要设置 order 来排序,因为必须让最后一个加载的去检查替换错误,之前的都可以不用检查

相关文章
|
Java Spring
Spring Boot入门(七) 之 配置文件占位符
Spring Boot入门(七) 之 配置文件占位符
110 0
|
XML Java 数据格式
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(下)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(下)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(下)
|
XML Java API
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(上)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(上)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(上)
|
XML Java 数据格式
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(中)
详解PropertyPlaceholderConfigurer、PropertyOverrideConfigurer等对属性配置文件Properties的加载和使用【享学Spring】(中)
|
Java Spring
Spring import配置文件使用占位符
import使用占位符 连接池切换导入配置的代码:
273 0
|
Java Spring
浅谈Spring的PropertyPlaceholderConfigurer
转自:http://blog.csdn.net/blueboz/article/details/54808915 转自:https://www.cnblogs.
663 0
|
Java Spring 数据安全/隐私保护
|
Java Spring druid
Spring import配置文件使用占位符
import使用占位符 连接池切换导入配置的代码: 在配置文件添加配置 db.connection.pool=druid 启动直接报错,读取不到配置,因为属性文件的加载在import配置文件之后。
1112 0
|
Java Spring 数据格式
Spring Boot - Spring占位符注入不了
spring里的占位符通常表现的形式是: 或者 @Configuration @ImportResource("classpath:/config/properties.xml") public class AppConfig { @Value("${jdbc.
1658 0