spring mybatis解決application.properties注入變量問題


問題描述

在使用spring mybatis的時候配置數據源dataSource,為了修改方便,新建了一個application.properties其中保存了jdbc.url,jdbc.username等信息。
這樣在dataSource定義的時候 可以直接使用jdbc.url這些變量。使用方式為 ${jdbc.url},可是配置完成之后,啟動程序報錯,
報錯原因是application中的jdbc.url變量沒有注入到datasource中。

問題原因

在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 進行自動掃描的時候,設置了sqlSessionFactory 的話,可能會導致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}這樣之類的表達式,將無法獲取到properties文件里的內容。

導致這一原因是因為,MapperScannerConigurer實際是在解析加載bean定義階段的,這個時候要是設置sqlSessionFactory的話,會導致提前初始化一些類,這個時候,PropertyPlaceholderConfigurer還沒來得及替換定義中的變量,導致把表達式當作字符串復制了。

解決方法

1.MapperScannerConigurer如果設置了sqlSessionFactory屬性,則注釋掉該屬性,並且保證sqlSessionFactory的id為sqlSessionFactory。
代碼如下:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mybatis_test.client" />
	<property name="markerInterface" value="mybatis_test.client.SuperMapper" />
	<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" /> -->
</bean>

2.將sqlSessionFactory改為sqlSessionFactoryBeanName
代碼如下:

<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" /> -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

環境配置

maven配置

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.7</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
</dependency>
<!-- spring 核心4.1.4 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>

參考

參考oschina上的解決方法

spring引入properties中的變量

通過配置

<!-- 當需要多個配置文件的時候,將ignore-unresolvable設置為"true"- -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:application.properties" />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM