MyBatis关键配置-接口注入使用
我们使用Mapper 的时候,只需要在加了Service 注解的类里面使用@Autowired注入Mapper 接口就好了。
@Service
public class EmployeeService {@AutowiredEmployeeMapper employeeMapper;public List<Employee> getAll() {return employeeMapper.selectByMap(null);}
}
Spring 在启动的时候需要去实例化EmployeeService。
EmployeeService 依赖了EmployeeMapper 接口(是EmployeeService 的一个属性)。
Spring 会根据Mapper 的名字从BeanFactory 中获取它的BeanDefination,再从BeanDefination 中获取BeanClass , EmployeeMapper 对应的BeanClass 是MapperFactoryBean(上一步已经分析过)。
接下来就是创建MapperFactoryBean,因为实现了FactoryBean 接口,同样是调用getObject()方法。
// MapperFactoryBean.java
public T getObject() throws Exception {return getSqlSession().getMapper(this.mapperInterface);
}
因为MapperFactoryBean 继承了SqlSessionDaoSupport , 所以这个getSqlSession()就是调用父类的方法,返回SqlSessionTemplate。
// SqlSessionDaoSupport.java
public SqlSession getSqlSession() {return this.sqlSessionTemplate;
}
第二步,SqlSessionTemplate 的getMapper()方法,里面又有两个方法:
// SqlSessionTemplate.java
public <T> T getMapper(Class<T> type) {return getConfiguration().getMapper(type, this);
}
第一步:SqlSessionTemplate 的getConfiguration()方法:
// SqlSessionTemplate.java
public Configuration getConfiguration() {return this.sqlSessionFactory.getConfiguration();
}
进入方法,通过DefaultSqlSessionFactory,返回全部配置Configuration:
// DefaultSqlSessionFactory.java
public Configuration getConfiguration() {return configuration;
}
第二步:Configuration 的getMapper()方法:
// Configuration.java
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {return mapperRegistry.getMapper(type, sqlSession);
}
这一步我们很熟悉, 跟编程式使用里面的getMapper 一样, 通过工厂类MapperProxyFactory 获得一个MapperProxy 代理对象。
也就是说,我们注入到Service 层的接口,实际上还是一个MapperProxy 代理对象。所以最后调用Mapper 接口的方法,也是执行MapperProxy 的invoke()方法,后面的流程就跟编程式的工程里面一模一样了。
总结:
对象 | 生命周期 |
SqlSessionTemplate |
Spring 中SqlSession 的替代品,是线程安全的,通过代理的方式调用 DefaultSqlSession 的方法 |
SqlSessionInterceptor(内部类) | 代理对象,用来代理DefaultSqlSession,在SqlSessionTemplate 中使用 |
SqlSessionDaoSupport | 用于获取SqlSessionTemplate,只要继承它即可 |
MapperFactoryBean |
注册到IOC 容器中替换接口类,继承了SqlSessionDaoSupport 用来获取 SqlSessionTemplate,因为注入接口的时候,就会调用它的getObject()方法 |
SqlSessionHolder | 控制SqlSession 和事务 |
思考:@MapperScan 注解是怎么解析的?
MyBatis关键配置-接口注入使用相关推荐
- MyBatis关键配置-接口的扫描注册
在Service 层可以使用@Autowired 自动注入的Mapper 接口, 需要保存在BeanFactory(比如XmlWebApplicationContext)中.也就是说接口肯定是在Spr ...
- MyBatis关键配置-创建会话工厂
Spring 对MyBatis 的对象进行了管理,但是并不会替换MyBatis 的核心对象.也就意味着:MyBatis jar 包中的SqlSessionFactory.SqlSession.Mapp ...
- MyBatis关键配置
我们先看一下把MyBatis 集成到Spring 中要做的几件事情. 为了让大家看起来更直观,这里我们依旧用传统的xml 配置给大家来做讲解,当然使用配置类@Configuration 效果也是一样的 ...
- 什么是Mybatis?Mybatis能干什么?Mybatis怎么配置?
简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...
- spring+SpringMVC+MyBatis之配置多数据源
数据库准备 1.准备2个数据库,本例以mysql为例 在第一个数据库新建表user -- ---------------------------- -- Table structure for use ...
- 【已解决】关于Mapper接口、service接口注入失败原因
背景: 1.使用maven分模块构建SSM工程 2.没有mybatis映射文件和核心配置文件 3.(2)中的配置都在spring配置中 错误信息 Error creating bean with na ...
- SpringBoo Mybatis Druid配置多数据源
SpringBoo Mybatis Druid配置多数据源 前言:当单个数据库无法满足大量读写操作需求的时候,就需要用到多个数据库实现读写分离了.那么,这个时候,就需要去配置多数据源了.那么具体如何配 ...
- 关于mapper接口注入spring容器
mapper是接口,而接口时不能注入spring容器的,要注入就需要接口有对应的实现类,注入的应该是实现类而不是接口 而在spring中,导入MyBatis-Spring包之后,MyBatis-Spr ...
- springboot 中 mybatis configuration 配置失效问题
springboot 中 mybatis configuration 配置失效问题 环境 场景 springboot角度分析 SqlSessionFactory 设置Configuration Myb ...
最新文章
- 二级域名做SEO优化有怎样的利弊关系?
- WPS for Linux【Debian、Ubuntu、Deepin、Linux Mint】字体缺失解决【批量字体安装】
- python量化数据处理小细节(以后还会不断补充)
- 数组正遍历,数组倒遍历
- vue-cli+webpack打包配置
- filter笔记(主要看到黑马教程的ppt)
- 现阶段的主流数据库分别是哪几种?
- Java实现附近地点搜索
- Oracle误删除dbf文件和表空间恢复
- css 侧栏跟随_JS+CSS实现侧边栏跟随浏览器滚动效果
- QPainter 画扇形
- 21 07 13学习总结
- js调用android.webkit,h5调用原生App的方法合集 window.webkit.messageHandlers
- omv检查硬盘坏道_技术员们有福了,关于怎么用MHDD修复硬盘坏道,现在免费给大家了!!!...
- mysql数据源配置
- 办公文书处理属于计算机应用中的,电大计算机应用基础总结基础知识单选题
- iOS10集成siri
- 【HTCVR】VRTK插件功能
- Linux下VCS/IRUN的操作命令
- 【Python训练营】Python每日一练----第6天:迷宫
热门文章
- flash 编程技巧应用 原创
- Kindeditor富文本编辑器使用
- 机械硬盘提示操作无法完成,因为磁盘管理控制台视图不是最新状态要如何办啊...
- jquery 中后代遍历之children、find区别
- 20161207py学习笔记
- 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
- mac 雪豹 10.6 五国
- 【Hibernate】getHibernateTemplate.find()和session.createQuery()方法总结
- scala:异常处理(try/catch)
- 《算法设计手册》面试题解答 第四章:排序和搜索