spring+mybatis 数据源读取不到配置文件的值

来源:互联网 发布:apache启动不了的原因 编辑:程序博客网 时间:2024/06/05 04:54

       最近在搭建maven + springmvc + spring + mybatis + mysql 过程中遇到一个问题(tomcat启动的时候报异常  

         java.lang.IllegalStateException: Could not load JDBC driver class [${jdbc_driverClassName}])经过查询相关资料最后解决,解决如下:


       开始我的application.xml中配置如下:

       <!-- 引入jdbc配置文件 -->    
     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
               <value>classpath*:/jdbc.properties</value>  
                <!--要是有多个配置文件,只需在这里继续添加即可 -->  
            </list>  
        </property>  
    </bean>  
      
      
  
    <!-- 配置数据源 -->  
    <bean id="dataSource"  
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <!-- 不使用properties来配置   
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />   
            <property name="url" value="jdbc:mysql://localhost:3306/weizl" />   
            <property name="username" value="root" />   
            <property name="password" value="123456" />-->
       <!-- 使用properties来配置 -->
        <property name="driverClassName" value="${jdbc_driverClassName}" />  
        <property name="url" value="${jdbc_url}"/> 
        <property name="username" value="${jdbc_username}" />  
        <property name="password" value="${jdbc_password}" />   
    </bean>  
  
    <!-- 配置Mybatis的文件 ,mapperLocations配置**Mapper.xml文件位置,configLocation配置mybatis-config文件位置-->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="mapperLocations" value="classpath*:com/wzl/mapper/*.xml"/>    
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />  
    </bean>  
    
    <!-- 自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,这样就不用一个一个手动配置Mpper的映射了,只要Mapper接口类和Mapper映射文件对应起来就可以了。 -->  
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="com.wzl.dao" />  
         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>  


引起问题的原因是由于MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当作字符串复制了

解决方法修改为如下配置:

 <!-- 引入jdbc配置文件 -->    
     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
               <value>classpath*:/jdbc.properties</value>  
                <!--要是有多个配置文件,只需在这里继续添加即可 -->  
            </list>  
        </property>  
    </bean>  
      
      
  
    <!-- 配置数据源 -->  
    <bean id="dataSource"  
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <!-- 不使用properties来配置   
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />   
            <property name="url" value="jdbc:mysql://localhost:3306/weizl" />   
            <property name="username" value="root" />   
            <property name="password" value="123456" />-->
       <!-- 使用properties来配置 -->
        <property name="driverClassName" value="${jdbc_driverClassName}" />  
        <property name="url" value="${jdbc_url}"/> 
        <property name="username" value="${jdbc_username}" />  
        <property name="password" value="${jdbc_password}" />   
    </bean>  
  
    <!-- 配置Mybatis的文件 ,mapperLocations配置**Mapper.xml文件位置,configLocation配置mybatis-config文件位置-->  
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="mapperLocations" value="classpath*:com/wzl/mapper/*.xml"/>    
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />  
    </bean>  
    
    <!-- 自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,这样就不用一个一个手动配置Mpper的映射了,只要Mapper接口类和Mapper映射文件对应起来就可以了。 -->  
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="com.wzl.dao" />  
         <property name="sqlSessionFactoryBeanName" value="sessionFactory" />
    </bean>  


说明:使用sqlSessionFactoryBeanName注入,不会立即初始化sqlSessionFactory, 所以不会引发提前初始化问题,同时还应注意在配置org.mybatis.spring.SqlSessionFactoryBean
这个Bean时,id不能为sqlSessionFactory,如果为这样的话会导致MapperScannerConigurer在bean定义加载时,加载PropertyPlaceholderConfigurer还没来得及替换定义中的变量

       

1 6