SpringMyBatis解析3-MapperFactoryBean

简介: 在使用mybatis的时候,我们获取dao的方式一般是这样: SqlSession session=sessionFactory.openSession(); PersonDao personDao=session.getMapper(PersonDao.class); 但在我们在spring的测试用例中使用mybatis的时候是这样使用的: PersonDao personDao=(PersonDao) context.getBean("personDao"); 答案就在MapperFactoryBean这里。

在使用mybatis的时候,我们获取dao的方式一般是这样:

SqlSession session=sessionFactory.openSession();  
PersonDao personDao=session.getMapper(PersonDao.class);  

但在我们在spring的测试用例中使用mybatis的时候是这样使用的:

PersonDao personDao=(PersonDao) context.getBean("personDao");  

答案就在MapperFactoryBean这里。

Spring中获取的名为personDao的bean,其实是与单独使用MyBatis完成了一样的功能,那么我们可以推断,在bean的创建过程中一定是使用了MyBatis中的原生方法sqlSession.getMapper(PersonDao.class)进行了再一次封装。结合配置文件,我们把分析目标转向org.mybatis.Spring.mapper.MapperFactoryBean,初步推测其中的逻辑应该在此类中实现。查看的类层次结构图MapperFactoryBean也实现了FactoryBean和InitializingBean接口。

MapperFactoryBean初始化

MapperFactoryBean继承了SqlSessionDaoSupport,SqlSessionDaoSupport继承DaoSupport,DaoSupport实现了InitializingBean接口,让我们开看看它这接口的实现:

public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {  
    // Let abstract subclasses check their configuration.  
    checkDaoConfig();  
    // Let concrete implementations initialize themselves.  
    try {  
     //initDao()方法是模板方法,设计为留给子类做进一步逻辑处理。 initDao(); }
catch (Exception ex) { throw new BeanInitializationException("Initialization of DAO failed", ex); } }

该方法主要包含两个功能,一个是调用checkDaoConfig()方法,一个是调用initDao方法。checkDaoConfig方法在DaoSupport是抽象方法,让我看看它在MapperFactoryBean的实现:

@Override  
 protected void checkDaoConfig() {  
   super.checkDaoConfig();  
   notNull(this.mapperInterface, "Property 'mapperInterface' is required");  
   Configuration configuration = getSqlSession().getConfiguration();  
   if (this.addToConfig && !configuration.hasMapper(this.mapperInterface)) {  
     try {  
       configuration.addMapper(this.mapperInterface);  
     } catch (Throwable t) {  
       logger.error("Error while adding the mapper '" + this.mapperInterface + "' to configuration.", t);  
       throw new IllegalArgumentException(t);  
     } finally {  
       ErrorContext.instance().reset();  
     }  
   }  
 }  

该方法主要是检查dao的配置,主要是检验sqlSessionFactory和mapperInterface属性不能为空,以及检测接口对于的映射文件是否存在,如果存在,那么就把它添加到configuration里面去,注册mapper。

在上面的函数中,configuration.addMapper(this.mapperInterface)其实就是将PersonDao注册到映射类型中,如果你可以保证这个接口一定存在对应的映射文件,那么其实这个验证并没有必要。但是,由于这个是我们自行决定的配置,无法保证这里配置的接口一定存在对应的映射文件,所以这里非常有必要进行验证。在执行此代码的时候,MyBatis会检查嵌入的映射接口是否存在对应的映射文件,如果没有回抛出异常,Spring正是在用这种方式来完成接口对应的映射文件存在性验证。

获取MapperFactoryBean的实例

public T getObject() throws Exception {  
  return getSqlSession().getMapper(this.mapperInterface);  
}  
在这里封装了getMapper操作,返回接口的实例,怪不得在Spring中使用MyBatis不用管理sqlSession了。 所以对于上面的测试用例,Spring怎么封装了MyBatis,如何把sqlSessionFactory和sqlSession隐藏了起来,又怎么方便的获取dao接口实例,我们大概有了一个了解。

 

目录
相关文章
|
关系型数据库 Java 数据库连接
SpringMyBatis解析1-使用示例
MyBatis使用介绍   MyBatis的详细使用介绍  http://www.cnblogs.com/xrq730/category/796495.html   建立PO  public class Person { private String id; private String name; //set get 方法、、、 } 建立Mapper mapper是数据库操作的映射文件,也就是我们常说的dao文件。
1060 0
|
Java Spring mybatis
SpringMyBatis解析2-SqlSessionFactoryBean
通过分析整合示例中的配置文件,我们可以知道配置的bean其实是成树状结构的,而在树的最顶层是类型为org.mybatis.spring.SqlSessionFactoryBean的bean,它将其他相关bean组装在了一起,那么,我们的分析就从此类开始。
998 0
|
Java Spring
SpringMyBatis解析4-MapperScannerConfigurer
如果有成百上千个dao接口呢,那我们岂不是要配置添加成百上千个bean,当然不是这样,spring还为MyBatis添加了拓展的功能,可以通过扫描包目录的方式,添加dao,让我看看具体使用和实现。 我们屏蔽掉了最原始的代码(userMapper 的创建)而增加了MapperScannerConfigurer的配置,basePackage属性是让你为映射器接口文件设置基本的包路径。
1127 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
349 2
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
843 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
340 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
8月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
9月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
2400 1

推荐镜像

更多
  • DNS