在系统启动时,MapperScannerConfigurer会立即加载sqlSessionFactory,这时property-placeholder正在解析jdbc.properties,因此会报错:
java.lang.ClassNotFoundException: ${jdbc.driverClass}
如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--
<property name="configLocation" value="classpath:mybatis-config.xml" />
-->
<property name="mapperLocations" value="classpath:com/mobile263/meeting/dao/*.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!--
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.mobile263.meeting.dao.UserDAO"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" lazy-init="true">
<property name="basePackage" value="com.mobile263.meeting.dao" />
<property name="sqlSessionFactoryBeanName" ref="sqlSessionFactory"></property>
</bean>给sqlSessionFactory取一个别名,然后以value的形式加载到org.mybatis.spring.mapper.MapperScannerConfigurer中,就不会立即加载sqlSessionFactory,从而导致读取jdbc.properties失败。
<property name="sqlSessionFactoryBeanName" value="aliasSqlSessionFactory"></property>配置文件改成:
<bean id="aliasSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--
<property name="configLocation" value="classpath:mybatis-config.xml" />
-->
<property name="mapperLocations" value="classpath:com/mobile263/meeting/dao/*.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!--
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.mobile263.meeting.dao.UserDAO"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" lazy-init="true">
<property name="basePackage" value="com.mobile263.meeting.dao" />
<property name="sqlSessionFactoryBeanName" value="aliasSqlSessionFactory"></property>
</bean>
<!-- 事务管理器配置,单数据源事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
本文介绍了解决在系统启动过程中由于MapperScannerConfigurer立即加载sqlSessionFactory导致无法正确读取jdbc.properties文件的问题。通过为sqlSessionFactory设置别名并延迟初始化MapperScannerConfigurer,避免了属性未完全配置好前尝试加载数据库配置的情况。
450

被折叠的 条评论
为什么被折叠?



