spring整合mybatis使用<context:property-placeholder>时的坑

背景
  最近项目要上线,需要开发一个数据迁移程序。程序的主要功能就是将一个数据库里的数据,查询出来经过一系列处理后导入另一个数据库。考虑到开发的方便快捷。自然想到用spring和mybatis整合一下。甚至用mybatis的自动代码生成,可以省下大量dao层的开发。

整合的坑
      之前的项目:以前也有过这种类似的程序,就把spring和mybatis整合的配置直接拿来修改下用。之前的整合配置是这样子的:

        1、考虑到数据库url、用户名密码的可配置性,将这些信息放入properties文件。在spring配置文件里使用了

   

  <context:property-placeholder location="classpath:config.properties" />
 

    2、在spring配置文件里的mybatis和spring的整合配置是这样

   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.lagou.chat.record.transfer.dao" />
    </bean> 
 

  以上配置是没有问题的。所以就直接将配置拷贝到新项目

   当前项目:将老项目的配置拷贝过来,但是新的项目要连接两个数据库,自然需要两个数据源(record和im),就对老的配置做了如下修改

    1、使用properties文件的配置不变

    2、之前因为就一个数据源(一个sqlSessionFactory),所以没有在MapperScannerConfigurer下配置<property name="sqlSessionFactory" ref="sqlSessionFactory"/>。因为默认使用sqlSessionFactory。但现在两个数据源了,不指定肯定导致混乱。所以配置修改为如下

复制代码
    <bean id="record_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="record_dataSource" />
    </bean>
    <bean id="config1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxx.util.rollback.record.dao" />
        <property name="sqlSessionFactory" ref="record_sqlSessionFactory"/>
    </bean> 

    <bean id="im_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="im_dataSource" />
    </bean>
    <bean id="config2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxx.util.rollback.im.dao" />
        <property name="sqlSessionFactory" ref="im_sqlSessionFactory"/>
    </bean> 
复制代码
 

  结果就是运行新项目时,spring配置文件里的${jdbc.url},${jdbc.name}等属性无法被properties里的指定值替换。一开始自然想不到是因为spring和mybatis整合的原因,所以一度不断检查spring配置文件是否有误,properties文件是否有误,是不是properties文件没被引用到或者properties文件没有被编译到classpath目录下等。当然,分析没有分析出问题的原因,自然就不可能找到解决问题的办法。只好求助于网络。最终还是找到了答案

  修正方式:将配置需改为如下,问题得到了解决:

复制代码
<bean id="record_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="record_dataSource" />
    </bean>
    <bean id="config1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxx.util.rollback.record.dao" />
        <property name="sqlSessionFactoryBeanName" value="record_sqlSessionFactory"/>
    </bean> 

    <bean id="im_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="im_dataSource" />
    </bean>
    <bean id="config2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxx.util.rollback.im.dao" />
        <property name="sqlSessionFactoryBeanName" value="im_sqlSessionFactory"/>
    </bean> 
复制代码
  就是将sqlSessionFactory属性改为sqlSessionFactoryBeanName。当然也得将ref改为value。因为sqlSessionFactoryBeanName属性是字符串类型

原因
  spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,可能会导致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}这样之类的表达式,将无法获取到properties文件里的内容。

  导致这一原因是因为,MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当作字符串复制了。 但如果不设置sqlSessionFactory 属性的话,就必须要保证sessionFactory在spring中名称一定要是sqlSessionFactory ,否则就无法自动注入。

引用原文链接https://www.cnblogs.com/metoy/p/5611277.html

 
  

 

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!

 
  

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

 

 

转载于:https://www.cnblogs.com/summary-2017/p/9053570.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个Spring MVC项目的配置文件,用于配置一些关键的组件和功能。让我一一解释一下: 1. `<mvc:annotation-driven/>`:启用Spring MVC注解驱动,使得控制器中的注解生效。 2. `<context:component-scan base-package="com.dgy"/>`:指定需要扫描的包,将被注解标记的类作为组件进行扫描。 3. `<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">`:配置视图解析器,用于解析并定位JSP视图文件。 4. `<context:property-placeholder location="classpath:jdbc.properties"/>`:加载属性文件jdbc.properties中的配置信息。 5. `<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">`:配置数据库连接池,使用阿里巴巴Druid连接池。 6. `<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">`:配置MyBatis的SqlSessionFactory,指定数据源。 7. `<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">`:配置MyBatis的Mapper接口扫描器,用于自动扫描并实例化Mapper接口的实现类。 8. `<tx:annotation-driven/>`:启用Spring事务注解驱动,使得注解标记的方法可以被事务管理。 9. `<aop:aspectj-autoproxy/>`:启用AOP自动代理,用于支持基于切面的编程。 10. `<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">`:配置事务管理器,使用Spring的DataSourceTransactionManager,将数据源注入事务管理器。 希望以上解释对您有所帮助!如果您还有其他问题,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值