zoukankan      html  css  js  c++  java
  • spring多个context:property-placeholder不生效问题

    先来看下A和B两个模块,A模块和B模块都分别拥有自己的Spring XML配置,并分别拥有自己的配置文件: 

    A模块的Spring配置文件如下: 

     
    <?xml version="1.0" encoding="UTF-8" ?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     
    xmlns:context="http://www.springframework.org/schema/context"
     
    xmlns:p="http://www.springframework.org/schema/p"
     
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
     
    <context:property-placeholder location="classpath*:conf/conf_a.properties"/>
     
    <bean class="com.xxx.aaa.Bean1"
     
    p:driverClassName="${modulea.jdbc.driverClassName}"
     
    p:url="${modulea.jdbc.url}"
     
    p:username="${modulea.jdbc.username}"
     
    p:password="${modulea.jdbc.password}"/>
     
    </beans>

    其配置文件位于类路径conf/conf_a.properties中: 

    modulea.jdbc.driverClassName=com.mysql.jdbc.Driver
     
    modulea.jdbc.username=cartan
     
    modulea.jdbc.password=superman
     
    modulea.jdbc.url=jdbc:mysql://127.0.0.1:3306/modulea?useUnicode=true&characterEncoding=utf8
    B模块的Spring配置文件如下: 
    
     
    <?xml version="1.0" encoding="UTF-8" ?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     
    xmlns:context="http://www.springframework.org/schema/context"
     
    xmlns:p="http://www.springframework.org/schema/p"
     
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
     
    <context:property-placeholder location="classpath*:conf/conf_b.properties"/>
     
    <bean class="com.xxx.bbb.Bean1"
     
    p:driverClassName="${moduleb.jdbc.driverClassName}"
     
    p:url="${moduleb.jdbc.url}"
     
    p:username="${moduleb.jdbc.username}"
     
    p:password="${moduleb.jdbc.password}"/>
     
    </beans>

    其配置文件位于类路径conf/conf_b.properties中: 

    moduleb.jdbc.driverClassName=com.mysql.jdbc.Driver
     
    moduleb.jdbc.username=cartan
     
    moduleb.jdbc.password=superman
     
    moduleb.jdbc.url=jdbc:mysql://127.0.0.1:3306/modulea?useUnicode=true&characterEncoding=utf8

    问题来了 。

    单独运行A模块,或单独运行B模块都是正常的,但将A和B两个模块集成后运行,Spring容器就启动不了了: 

    Could not resolve placeholder 'moduleb.jdbc.driverClassName' in string value "${moduleb.jdbc.driverClassName}"

    原因是。

    Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了)。 

    而<context:property-placeholder/>这个基于命名空间的配置,其实内部就是创建一个PropertyPlaceholderConfigurer Bean而已。换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其余的会被Spring忽略掉(其实Spring如果提供一个警告就好了)。 

    拿上来的例子来说,如果A和B模块是单独运行的,由于Spring容器都只有一个PropertyPlaceholderConfigurer,因此属性文件会被正常加载并替换掉。如果A和B两模块集成后运行,Spring容器中就有两个PropertyPlaceholderConfigurer Bean了,这时就看谁先谁后了, 先的保留,后的忽略!因此,只加载到了一个属性文件,因而造成无法正确进行属性替换的问题。 

    解决方法。

    属性文件加载在统一的地方做,不要分模块加载即可。 

    A模块a.application.xml

    <?xml version="1.0" encoding="UTF-8" ?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     
    xmlns:context="http://www.springframework.org/schema/context"
     
    xmlns:p="http://www.springframework.org/schema/p"
     
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
     
    <!--<context:property-placeholder location="classpath*:conf/conf_a.properties"/>-->
     
    <bean class="com.xxx.aaa.Bean1"
     
    p:driverClassName="${modulea.jdbc.driverClassName}"
     
    p:url="${modulea.jdbc.url}"
     
    p:username="${modulea.jdbc.username}"
     
    p:password="${modulea.jdbc.password}"/>
     
    </beans>

    B模块b.application.xml

    <?xml version="1.0" encoding="UTF-8" ?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     
    xmlns:context="http://www.springframework.org/schema/context"
     
    xmlns:p="http://www.springframework.org/schema/p"
     
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
     
    <!--<context:property-placeholder location="classpath*:conf/conf_b.properties"/>-->
     
    <bean class="com.xxx.bbb.Bean1"
     
    p:driverClassName="${moduleb.jdbc.driverClassName}"
     
    p:url="${moduleb.jdbc.url}"
     
    p:username="${moduleb.jdbc.username}"
     
    p:password="${moduleb.jdbc.password}"/>
     
    </beans>

    集成

    <?xml version="1.0" encoding="UTF-8" ?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     
    xmlns:context="http://www.springframework.org/schema/context"
     
    xmlns:p="http://www.springframework.org/schema/p"
     
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
     
    <context:property-placeholder location="classpath*:conf/conf*.properties"/>
     
    <import resource="a.xml"/>
     
    <import resource="b.xml"/>
     
    </beans>
     
  • 相关阅读:
    网站安全编程 黑客入侵 脚本黑客 高级语法入侵 C/C++ C# PHP JSP 编程
    【算法导论】贪心算法,递归算法,动态规划算法总结
    cocoa2dx tiled map添加tile翻转功能
    8月30日上海ORACLE大会演讲PPT下载
    【算法导论】双调欧几里得旅行商问题
    Codeforces Round #501 (Div. 3) B. Obtaining the String (思维,字符串)
    Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)
    Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle (数学,区间)
    洛谷 P1379 八数码难题 (BFS)
    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords (贪心)
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/10995973.html
Copyright © 2011-2022 走看看