文广网站建设,苏州制作网站的公司,河北沧州最新消息,网站建设模板素材SpringMybatis使用MapperScannerConfigurer简化配置
MyBatis的一大亮点就是可以不用DAO层的实现类#xff0c;而我们知道service层调dao层
如果没有实现类#xff0c;Spring如何为Service注入DAO的实例呢#xff1f;
比如
现在有一个dao层的bookmapper和配置mybatis的xm…SpringMybatis使用MapperScannerConfigurer简化配置
MyBatis的一大亮点就是可以不用DAO层的实现类而我们知道service层调dao层
如果没有实现类Spring如何为Service注入DAO的实例呢
比如
现在有一个dao层的bookmapper和配置mybatis的xml类
mybatis-config.xml也配置好了mapper
] 并且有了一个Book的pojo类 BookMapper接口 ] Bookmapper.xml 我们的service 层有一个bookservice和实现类
] 问题来了现在spring容器里啥都没有甚至度没有spring我们的bookserviceImpl应该注入啥 当然后面的service层spring-service.xml的配置还是有的 !--BookServiceImpl注入到IOC容器中--bean idBookServiceImpl classcom.yj.service.BookServiceImplproperty namebookMapper refbookMapper//bean这样控制层调用业务层是没问题的
如conreoller包下面的BookController
import java.util.List;Controller
RequestMapping(/book)
public class BookController {AutowiredQualifier(BookServiceImpl)private BookService bookService;RequestMapping(/allBook)public String list(Model model) {ListBooks list bookService.findAllBook();model.addAttribute(list, list);return allBook;关键是没有dao层的bean所以一定会出错所以就出现MapperScannerConfigurer
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口也就是本文用的dao层下面的BookMapper生成代理注入到Spring
原理是
Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理. 例如
bean iduserMapper classorg.mybatis.spring.mapper.MapperFactoryBeanproperty namemapperInterface valueorg.mybatis.spring.sample.mapper.UserMapper /property namesqlSessionFactory refsqlSessionFactory /
/beanMapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。
上面的配置有一个很大的缺点就是系统有很多的配置文件时 全部需要手动编写所以上述的方式已经很用了。
没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。
或者这样理解原理
MyBatis-Spring提供了一个MapperFactoryBean可以将数据映射接口转为Spring Bean。
bean iduserDao classorg.mybatis.spring.mapper.MapperFactoryBeanproperty namemapperInterface valuedao.UserMapper/property namesqlSessionFactory refsqlSessionFactory//bean如果数据映射接口很多的话需要在Spring的配置文件中对数据映射接口做配置相应的配置项会很多了。为了简化配置在MyBatis-Spring中提供了一个转换器MapperScannerConfig它可以将接口转换为Spring容器中的Bean在Service中Autowired的方法直接注入接口实例。在Spring的配置文件中可以采用以下所示的配置将接口转化为Bean。
!--sqlSessionFactory 工厂 --bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdatasource /
!--绑定mybatis的配置文件还可以在这可要可不要,甚至可以和配置文件对应或者删除点它或者用他的许多方法--property nameconfigLocation valueclasspath:MyBatis-config.xml/property namemapperLocations valueclasspath:com/yang/mapper/UserMapper.xml//bean!-- dao配置 --
bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuecom.study.dao /property namesqlSessionFactoryBeanName valuesqlSessionFactory /
/beanMapperScannerConfigurer的作用
MyBatis的一大亮点就是可以不用dao层的实现类而我们知道在开发中service层需要调用dao层如果没有dao的实现类Spring如何为Service注入dao的实例呢
Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理。MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码使用动态代理实现。比如下面这个官方文档中的配置
bean iduserMapper classorg.mybatis.spring.mapper.MapperFactoryBeanproperty namemapperInterface valueorg.mybatis.spring.sample.mapper.UserMapper /property namesqlSessionFactory refsqlSessionFactory /
/beanorg.mybatis.spring.sample.mapper.UserMapper是一个接口我们创建一个MapperFactoryBean实例然后注入这个接口和sqlSessionFactorymybatis中提供的SqlSessionFactory接口MapperFactoryBean会使用SqlSessionFactory创建SqlSession这两个属性。之后想使用这个UserMapper接口的话直接通过Spring注入这个bean然后就可以直接使用了Spring内部会创建一个这个接口的动态代理。 上面的配置有一个很大的缺点就是系统有很多的配置文件时全部需要手动编写所以上述的方式已经不建议用了。当发现要使用多个MapperFactoryBean的时候一个一个定义肯定非常麻烦于是mybatis-spring提供了MapperScannerConfigurer这个类它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
MapperScannerConfigurer是spring和mybatis整合的mybatis-spring的jar包中提供的一个类。
bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valueorg.mybatis.spring.sample.mapper /
/bean这段配置会扫描org.mybatis.spring.sample.mapper下的所有接口然后创建各自接口的动态代理类。这样Service就可以注入dao的实例了。