Spring整合Mybatis使用<context:property-placeholder>時的坑
背景
最近項(xiàng)目要上線,需要開發(fā)一個數(shù)據(jù)遷移程序。程序的主要功能就是將一個數(shù)據(jù)庫里的數(shù)據(jù),查詢出來經(jīng)過一系列處理后導(dǎo)入另一個數(shù)據(jù)庫??紤]到開發(fā)的方便快捷。自然想到用spring和mybatis整合一下。甚至用mybatis的自動代碼生成,可以省下大量dao層的開發(fā)。
整合的坑
之前的項(xiàng)目:以前也有過這種類似的程序,就把spring和mybatis整合的配置直接拿來修改下用。之前的整合配置是這樣子的:
1、考慮到數(shù)據(jù)庫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>
以上配置是沒有問題的。所以就直接將配置拷貝到新項(xiàng)目
當(dāng)前項(xiàng)目:將老項(xiàng)目的配置拷貝過來,但是新的項(xiàng)目要連接兩個數(shù)據(jù)庫,自然需要兩個數(shù)據(jù)源(record和im),就對老的配置做了如下修改
1、使用properties文件的配置不變
2、之前因?yàn)榫鸵粋€數(shù)據(jù)源(一個sqlSessionFactory),所以沒有在MapperScannerConfigurer下配置<property name="sqlSessionFactory" ref="sqlSessionFactory"/>。因?yàn)槟J(rèn)使用sqlSessionFactory。但現(xiàn)在兩個數(shù)據(jù)源了,不指定肯定導(dǎo)致混亂。所以配置修改為如下
<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>
結(jié)果就是運(yùn)行新項(xiàng)目時,spring配置文件里的${jdbc.url},${jdbc.name}等屬性無法被properties里的指定值替換。一開始自然想不到是因?yàn)閟pring和mybatis整合的原因,所以一度不斷檢查spring配置文件是否有誤,properties文件是否有誤,是不是properties文件沒被引用到或者properties文件沒有被編譯到classpath目錄下等。當(dāng)然,分析沒有分析出問題的原因,自然就不可能找到解決問題的辦法。只好求助于網(wǎng)絡(luò)。最終還是找到了答案
修正方式:將配置需改為如下,問題得到了解決:
<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。當(dāng)然也得將ref改為value。因?yàn)閟qlSessionFactoryBeanName屬性是字符串類型
原因
spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 進(jìn)行自動掃描的時候,設(shè)置了sqlSessionFactory 的話,可能會導(dǎo)致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}這樣之類的表達(dá)式,將無法獲取到properties文件里的內(nèi)容。
導(dǎo)致這一原因是因?yàn)椋琈apperScannerConigurer實(shí)際是在解析加載bean定義階段的,這個時候要是設(shè)置sqlSessionFactory的話,會導(dǎo)致提前初始化一些類,這個時候,PropertyPlaceholderConfigurer還沒來得及替換定義中的變量,導(dǎo)致把表達(dá)式當(dāng)作字符串復(fù)制了。 但如果不設(shè)置sqlSessionFactory 屬性的話,就必須要保證sessionFactory在spring中名稱一定要是sqlSessionFactory ,否則就無法自動注入。
以上所述是小編給大家介紹的Spring整合Mybatis使用<context:property-placeholder>時的坑 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java使用poi-tl設(shè)置word圖片環(huán)繞方式為浮于在文字上方
POI-TL 是一個基于 Apache POI 的 Java 庫,專注于在 Microsoft Word 文檔(.docx 格式)中進(jìn)行模板填充和動態(tài)內(nèi)容生成,下面我們看看如何使用poi-tl設(shè)置word圖片環(huán)繞方式為浮于在文字上方吧2025-03-03
學(xué)java得這樣學(xué),學(xué)習(xí)確實(shí)也得這樣
學(xué)java得這樣學(xué),學(xué)習(xí)東西確實(shí)也得這樣2008-02-02
springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢
這篇文章主要介紹了springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Spring AOP定義AfterReturning增加實(shí)例分析
這篇文章主要介紹了Spring AOP定義AfterReturning增加,結(jié)合實(shí)例形式分析了Spring面相切面AOP定義AfterReturning增加相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-01-01
Springboot PostMapping無法獲取數(shù)據(jù)問題及解決
這篇文章主要介紹了Springboot PostMapping無法獲取數(shù)據(jù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

