-
Mybatis 接口编程中dao 层接口没有注解和 为什么能被实例化为bean?
在Spring配置Mybatis的文件中我们可以看到如下代码:
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 自动扫描mapping.xml文件 -->
<property name="basePackage"
value="classpath:com/cn/zhang/mapping/*.xml">
</property>
MapperScannerConfigurer,让它扫描特定的包,自动帮我们成批地创建映射器。这样就大大减少了配置的工作量。
mybatis dao层这时候需要写注解
@Mapper和@Repository注解
它们的区别:
1.使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中 ,即我们省去了在spring.xml中写对应的mapper接口的位置。
2.@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
但是这样依旧会出现注解重复写,配置地址繁琐的问题,于是spring有这样的配置,解决了这个问题。
DAO接口所在包名,Spring会自动查找其下的类
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cn.hnust.dao" />
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory">
</property>
</bean>
与Spring集成可以分为3个步骤.
- 把Java类对应的Mapper接口类纳入Spring中的IOC容器管理。
- 把Java类对应的XML命名空间添加到Mybatis中的Configuration类中的mapperRegistry(用于管理Mybatis的Mapper).
- 使用Spring中的IOC容器扩展FactoryBean获取到Mapper的实例。(第一步纳入Spring只是接口)
说人话就是,你啥都省了,不需要你写更多的对应配置地址,注解,你只需要专注写接口就行。
但是,这样也是有坏处的,这样就不能用mybatis的方法,我所接触到的,是重写一个mybatis的基类,对mybatis进行一层的小包装,让我们省去了不使用spring整合的每次都要写sqlsession工厂才能调用方法。当然了这是我个人的一些自我总结,大家作为参考看哦。