mapper是接口,而接口时不能注入spring容器的,要注入就需要接口有对应的实现类,注入的应该是实现类而不是接口
而在spring中,导入MyBatis-Spring包之后,MyBatis-Spring中间件把mapper接口和mapper.xml文件对应的
代理类注册到Spring中,
因此,在service层中就能根据类型注入,使用到mapper接口的代理类调用需要的方法
而mapper的代理类在spring开发环境下是 利用sqlSession来获取的!!以UserMapper举例
写成:
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="userMapper" class="com.wang.mapper.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSession"/>
</bean>
再去UserMapper的是实现类UserMapperImpl中利用sqlSessionTemplate属性调用getMapper来获得Mapper的代理类注入到spring中去
或者简写成(动态代理方式,无需显式定义实现类):
<!--4.配置dao接口扫描包,动态的实现了Dao接口,利用代理类注入到Spring容器中! -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--要扫描的dao包-->
<property name="basePackage" value="com.wang.dao"/>
</bean>
这样写后,就无须显式实现UserMapper接口,也就是无需显示调用sqlSessionTemplate的getMapper方法来获取代理类
而只要将定义好的sqlSessionFactory以及mapper接口填到一个MapperScannerConfigurer的bean的属性中去,之后就会动态生成mapper的代理类注入到spring中去
**个人拙见,不对望批评指正**
本文介绍了在 Spring 中如何将 MyBatis 的 Mapper 接口注入并使用。通常,接口不能直接注入 Spring 容器,需要通过实现类。但在 MyBatis-Spring 中,Mapper 接口的代理类会自动注册到 Spring。可以显式定义实现类注入,或者使用 MapperScannerConfigurer 动态扫描包,实现无须显示实现类的注入。Mapper 的代理类是基于 sqlSession 获取的,通过 sqlSessionTemplate 调用 getMapper 方法实现。
654

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



