springmvc 整合mybatis dao层不写实现类,及MapperScannerConfigurer 引起的PropertyPlaceholderConfigurer无效问题解决方法

在一个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']}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值