Spring整合Mybatis應用<context:property-placeholder>時的坑。本站提示廣大學習愛好者:(Spring整合Mybatis應用<context:property-placeholder>時的坑)文章只能為提供參考,不一定能成為您想要的結果。以下是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 ,不然就沒法主動注入。
以上所述是小編給年夜家引見的Spring整合Mybatis應用<context:property-placeholder>時的坑 ,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!