Spring+Mybatis使用MapperScannerConfigurer简化配置__MapperScannerConfigurer的作用

Spring+Mybatis使用MapperScannerConfigurer简化配置

MyBatis的一大亮点就是可以不用DAO层的实现类,而我们知道service层调dao层

如果没有实现类,Spring如何为Service注入DAO的实例呢?

比如

现在有一个dao层的bookmapper和配置mybatis的xml类
img

mybatis-config.xml也配置好了mapper

img]
并且有了一个Book的pojo类,
BookMapper接口
img]
Bookmapper.xml
img
我们的service 层有一个bookservice和实现类

img]
img
问题来了,现在spring容器里啥都没有甚至度没有spring,我们的bookserviceImpl应该注入啥

img
当然后面的service层spring-service.xml的配置还是有的

   <!--BookServiceImpl注入到IOC容器中--><bean id="BookServiceImpl" class="com.yj.service.BookServiceImpl"><property name="bookMapper" ref="bookMapper"/></bean>

这样控制层调用业务层是没问题的

如conreoller包下面的BookController

import java.util.List;@Controller
@RequestMapping("/book")
public class BookController {@Autowired@Qualifier("BookServiceImpl")private BookService bookService;@RequestMapping("/allBook")public String list(Model model) {List<Books> list = bookService.findAllBook();model.addAttribute("list", list);return "allBook";

关键是没有dao层的bean,所以一定会出错,所以就出现MapperScannerConfigurer

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口(也就是本文用的dao层下面的BookMapper)生成代理注入到Spring

原理是

Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理. 例如

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。

上面的配置有一个很大的缺点,就是系统有很多的配置文件时 全部需要手动编写,所以上述的方式已经很用了。

没有必要在 Spring 的 XML 配置文件中注册所有的映射器。相反,你可以使用一个 MapperScannerConfigurer , 它 将 会 查 找 类 路 径 下 的 映 射 器 并 自 动 将 它 们 创 建 成 MapperFactoryBean。

或者这样理解原理

MyBatis-Spring提供了一个MapperFactoryBean,可以将数据映射接口转为Spring Bean。

<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="dao.UserMapper"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>

如果数据映射接口很多的话,需要在Spring的配置文件中对数据映射接口做配置,相应的配置项会很多了。为了简化配置,在MyBatis-Spring中提供了一个转换器MapperScannerConfig它可以将接口转换为Spring容器中的Bean,在Service中@Autowired的方法直接注入接口实例。在Spring的配置文件中可以采用以下所示的配置将接口转化为Bean。

<!--sqlSessionFactory 工厂 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="datasource" />
<!--绑定mybatis的配置文件还可以在这(可要可不要),甚至可以和配置文件对应,或者删除点它或者用他的许多方法--><property name="configLocation" value="classpath:MyBatis-config.xml"/><property name="mapperLocations" value="classpath:com/yang/mapper/UserMapper.xml"/></bean><!-- dao配置 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.study.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

MapperScannerConfigurer的作用

MyBatis的一大亮点就是可以不用dao层的实现类,而我们知道在开发中service层需要调用dao层,如果没有dao的实现类,Spring如何为Service注入dao的实例呢?

Mybatis在与Spring集成的时候可以配置MapperFactoryBean来生成Mapper接口的代理。MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。比如下面这个官方文档中的配置:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

org.mybatis.spring.sample.mapper.UserMapper是一个接口,我们创建一个MapperFactoryBean实例,然后注入这个接口和sqlSessionFactory(mybatis中提供的SqlSessionFactory接口,MapperFactoryBean会使用SqlSessionFactory创建SqlSession)这两个属性。之后想使用这个UserMapper接口的话,直接通过Spring注入这个bean,然后就可以直接使用了,Spring内部会创建一个这个接口的动态代理。
上面的配置有一个很大的缺点,就是系统有很多的配置文件时,全部需要手动编写,所以上述的方式已经不建议用了。当发现要使用多个MapperFactoryBean的时候,一个一个定义肯定非常麻烦,于是mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。

MapperScannerConfigurer是spring和mybatis整合的mybatis-spring的jar包中提供的一个类。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

这段配置会扫描org.mybatis.spring.sample.mapper下的所有接口,然后创建各自接口的动态代理类。这样,Service就可以注入dao的实例了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python类的定义和创建_Python类对象的创建和使用

通过前面章节的学习&#xff0c;我们已经学会如何定义一个类&#xff0c;但要想使用它&#xff0c;必须创建该类的对象。 创建类对象的过程&#xff0c;又称为类的实例化。 类名(参数) 定义类时&#xff0c;如果没有手动添加 __init__() 构造方法&#xff0c;又或者添加的 __in…

mybatis中<mappers> ,mapperLocations,和MapperScannerConfigurer 用法

mybatis中&#xff1c;mappers&#xff1e; &#xff0c;mapperLocations&#xff0c;和MapperScannerConfigurer 用法 1. mappers标签 在mybatis单独使用时&#xff0c;mybatis需要在mybatis-config.xml中配置mappers。mappers 标签下有许多 mapper 标签&#xff0c;每一个 …

python的property用法_在python中property怎样使用-百度经验

在python中property可以使类中的方法变为类中的属性一样来使用&#xff0c;使得类中的属性值不易暴露&#xff0c;更加安全&#xff0c;那么在python中property怎样使用呢&#xff1f;下面小编就带大家来看看详细的教程&#xff01;工具/原料 python的版本&#xff1a;python 3…

Spring AOP 实现原理

什么是AOP AOP&#xff08;Aspect-OrientedProgramming&#xff0c;面向方面编程&#xff09;&#xff0c;可以说是OOP&#xff08;Object-Oriented Programing&#xff0c;面向对象编程&#xff09;的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构&…

java string类的方法_Java-String类的常用方法总结

一、String类String类在java.lang包中&#xff0c;java使用String类创建一个字符串变量&#xff0c;字符串变量属于对象。java把String类声明的final类&#xff0c;不能有类。String类对象创建后不能修改&#xff0c;由0或多个字符组成&#xff0c;包含在一对双引号之间二、Str…

python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析 Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析】 来源&#xff1a;https://blog.csdn.net/qq_40705355/article/details/83856960七天天气来源&#xff1a;http://www.weather.com.cn/weather/…

Spring IOC原理总结

Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息&#xff0c;并在Spring容器中生成一份相应的Bean配置注册表&#xff0c;然后根据这张注册表实例化Bean&#xff0c;装配好Bean之间的依赖关系&#xff0c;为上层应用提供准备就绪的运行环境。 Bean缓存池&…

java 线程 释放_java线程似乎不会被释放

我没有回答为什么第四个连接挂起,除了说这里是一个有效的代码版本…public class Test {public static void main(String[] args) throws Exception {ServerSocket listen new ServerSocket(9999);ExecutorService threadPool Executors.newFixedThreadPool(3);while(true) {…

Linux开发工具——gcc篇

gcc的使用 文章目录 gcc的使用 历史遗留问题&#xff08;普通用户sudo&#xff09; gcc编译过程 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&a…

python 递归函数例子_python函数递归的几个例子

斐波那契数列1,1,2,3,5,8,13,21……#!/usr/bin/env python# encoding: utf-8def fib(n):if n 1 or n 2:return 1else:return fib(n-1) fib(n-2)print fib(6)汉诺塔#!/usr/bin/env python# encoding: utf-8count 0def hanoi(n,a左,b中,c"右"):global countif n 1…

Shiro——RememberMe

Shiro提供了记住我&#xff08;RememberMe&#xff09;的功能&#xff0c;比如访问如淘宝等一些网站时&#xff0c;关闭了浏览器下次再打开时还是能记住你是谁&#xff0c;下次访问时无需再登录即可访问&#xff0c;基本流程如下&#xff1a; 1、首先在登录页面选中RememberMe…

python报表_Python生成报表

excel def export_teachers_excel(request): # 创建工作簿 wb xlwt.Workbook() # 添加工作表 sheet wb.add_sheet(老师信息表) # 查询所有老师的信息(注意&#xff1a;这个地方稍后需要优化) queryset Teacher.objects.all() # 向Excel表单中写入表头 colnames (姓名, 介绍…

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念&#xff0c;对于初学Spring的人来说&#xff0c;总觉得IoC 、DI这两个概念是模糊不清的&#xff0c;是很难理解的&#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…

如何将一个向量投影到一个平面上_CameraLidar投影:2D3D导航

点击上方“AI小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达图1.图像上的激光雷达点激光雷达和照相机是用于感知和理解场景的两个基本传感器。他们建立周边环境模型、提供检测和确定其他对象位置的方法&#xff0c;从而为机器人提…

java类加载机制面试题_通过面试题解析 Java 类加载机制

在许多Java面试中&#xff0c;我们经常会看到关于Java类加载机制的考察&#xff0c;例如下面这道题&#xff1a;class Grandpa{static{System.out.println("爷爷在静态代码块");}}class Father extends Grandpa{static{System.out.println("爸爸在静态代码块&qu…

JAVA中和、||和|的区别?

问题一&#xff1a;JAVA中&&和&、||和|&#xff08;短路与和逻辑与、短路或和逻辑或&#xff09;的区别&#xff1f; 首先名称是不同的 逻辑运算符&#xff1a;&#xff06;&#xff06;逻辑与  &#xff5c;&#xff5c;逻辑或  它们都是逻辑运算符 位运算…

pppoe拨号的外网ip无法ping通_【思唯网络学院】 五大网络概念:IP地址、子网掩码、网关、DHCP服务和PPPoE拨号...

5G技术的更新&#xff0c;推动了新一代的网络通信发展&#xff0c;家庭宽带上网也从最初的十几K的速度&#xff0c;提升到了现在动则上百上千兆的速度&#xff0c;很多有部署了家庭NAS的用户&#xff0c;甚至都已经更新到了10G级别的内部局域网了。在这个信息互联的时代&#x…

jsp import mysql con_jsp的分页查询的代码(mysql数据库)

[原来没有写过&#xff0c;听朋友说&#xff0c;比较难&#xff0c;就试一下&#xff0c;还是挺简单的&#xff0c;只不过&#xff0c;具体实用方面还得自己写&#xff0c;没有什么难的&#xff0c;自己看看就懂了。bean文件&#xff1a;package bean;/** * jspjava bea这个功能…

MySQL数据库的数据类型以及取值范围详解

主要包括以下五大类&#xff1a; 整数类型&#xff1a;BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型&#xff1a;FLOAT、DOUBLE、DECIMAL 字符串类型&#xff1a;CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDI…

flex布局_flex布局的 flex(felx-grow、flex-shrink、flex-basis)详解

flex布局中的flex-grow,flex-shrink,flex-basis接上篇文章&#xff0c;1. flex-grow属性flex-grow定义剩余空间的分成。默认为0&#xff0c;即如果存在剩余空间&#xff0c;也不放大。如何理解这里的剩余空间呢&#xff0c;用例子来说明吧。默认的情况(flex-grow:0)在浏览器下是…