在一个springmvc+mybatis 项目中发现dao层没有实现类并且 没有发现dao层注解但是在service 层确实用了
@Autowired
private Dao dao;
并且不报空指针的错误,随猜测在某个配置文件中必有一个自动注入dao层的东西 最终发现
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- myBatis文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="configLocation" value="classpath:configuration.xml" />
<property name="mapperLocations" value="classpath:com/zyc/mapping/*/*.xml" />
</bean>
spring+mybatis使用MapperScannerConfigurer 会引起的PropertyPlaceholderConfigurer无效问题
在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,他会优先于PropertyPlaceholderConfigurer执行,从而导致PropertyPlaceholderConfigurer失效,如果你的数据库连接配置这时用${jdbc.url}、${jdbc.driverClassName}等这样之类的表达式,将无法获取到properties文件里的内容。
解决方法 就是将配置文件的sqlSessionFactory 改名如
<!-- myBatis文件 -->
<bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="configLocation" value="classpath:configuration.xml" />
<property name="mapperLocations" value="classpath:com/zyc/mapping/*/*.xml" />
</bean>
上述解决方案是在
<property name="sqlSessionFactoryBeanName" value="mySqlSessionFactory" />
这个属性名为 sqlSessionFactoryBeanName 的前提下。如果属性名为sqlSessionFactory 则行不通
后续:
在后来的struts2+spring+mybatis项目中 发现使用sqlSessionFactoryBeanName替换sqlSessionFactory效果并不太理想
后来得到一种方法就是将PropertyPlaceholderConfigurer替换成PropertiesFactoryBean ,这样就可以不使用sqlSessionFactoryBeanName属性了
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
替换成
<bean id="propertiesFactoryBean" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
</list>
</property>
</bean>
获取配置文件中的值得方式也改变一下由${'jdbc_url'} 格式变成 #{propertiesFactoryBean['jdbc_url']}