Spring和Mybatis整合时无法读取properties的处理方案

原创
2015/11/02 15:39
阅读数 1.9K
<!-- 使用druid开源数据库连接池 -->
   <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
         init-method="init" destroy-method="close">
           
          <property name="driver" value="${mop.cms.driver.class}"/>
          <property name="url" value="${mop.cms.jdbc.url}" />
          <property name="username" value="${mop.cms.jdbc.username}" />
          <property name="password" value="${mop.cms.jdbc.password}" />

          <property name="initialSize" value="${mop.cms.druid.initialSize}" />
          <property name="minIdle" value="${mop.cms.druid.minIdle}" />
          <property name="maxActive" value="${mop.cms.druid.maxActive}" />

          <property name="maxWait" value="${mop.cms.druid.maxWait}" />

          <property name="timeBetweenEvictionRunsMillis"
                    value="${mop.cms.druid.timeBetweenEvictionRunsMillis}" />

          <property name="minEvictableIdleTimeMillis"
                    value="${mop.cms.druid.minEvictableIdleTimeMillis}" />

          <property name="validationQuery" value="${mop.cms.druid.validationQuery}" />
          <property name="testWhileIdle" value="${mop.cms.druid.testWhileIdle}" />
          <property name="testOnBorrow" value="${mop.cms.druid.testOnBorrow}" />
          <property name="testOnReturn" value="${mop.cms.druid.testOnReturn}" />

          <property name="poolPreparedStatements" value="${mop.cms.druid.poolPreparedStatements}" />

   </bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- mybatis session factory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:sqlmap-config.xml" />
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- 开启事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- 会自动将basePackage中配置的包路径下的所有dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    <property name="basePackage" value="com.meizu.mop.cms.mapper" />
</bean>

 此时,启动会报异常,${mop.cms.driver.class}这样的表达式获取不到properties里面的值,因为MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当作字符串复制了,解决的办法如下:

 

方法一:

修改<property name="sqlSessionFactory" ref="sqlSessionFactory"/>为

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

原理:使用sqlSessionFactoryBeanName注入,不会立即初始化sqlSessionFactory, 所以不会引发提前初始化问题。

 

方法二:

直接删掉<property name="sqlSessionFactory" ref="sqlSessionFactory"/>

注意:在没有配置这一行时,必须配置一个以sqlSessionFactory命名的org.mybatis.spring.SqlSessionFactoryBean。



展开阅读全文
加载中

作者的其它热门文章

打赏
0
2 收藏
分享
打赏
2 评论
2 收藏
0
分享
返回顶部
顶部