問題描述
在使用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>
參考
spring引入properties中的變量
通過配置
<!-- 當需要多個配置文件的時候,將ignore-unresolvable設置為"true"- -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:application.properties" />