我们使用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关键配置-接口注入使用相关推荐

  1. MyBatis关键配置-接口的扫描注册

    在Service 层可以使用@Autowired 自动注入的Mapper 接口, 需要保存在BeanFactory(比如XmlWebApplicationContext)中.也就是说接口肯定是在Spr ...

  2. MyBatis关键配置-创建会话工厂

    Spring 对MyBatis 的对象进行了管理,但是并不会替换MyBatis 的核心对象.也就意味着:MyBatis jar 包中的SqlSessionFactory.SqlSession.Mapp ...

  3. MyBatis关键配置

    我们先看一下把MyBatis 集成到Spring 中要做的几件事情. 为了让大家看起来更直观,这里我们依旧用传统的xml 配置给大家来做讲解,当然使用配置类@Configuration 效果也是一样的 ...

  4. 什么是Mybatis?Mybatis能干什么?Mybatis怎么配置?

    简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...

  5. spring+SpringMVC+MyBatis之配置多数据源

    数据库准备 1.准备2个数据库,本例以mysql为例 在第一个数据库新建表user -- ---------------------------- -- Table structure for use ...

  6. 【已解决】关于Mapper接口、service接口注入失败原因

    背景: 1.使用maven分模块构建SSM工程 2.没有mybatis映射文件和核心配置文件 3.(2)中的配置都在spring配置中 错误信息 Error creating bean with na ...

  7. SpringBoo Mybatis Druid配置多数据源

    SpringBoo Mybatis Druid配置多数据源 前言:当单个数据库无法满足大量读写操作需求的时候,就需要用到多个数据库实现读写分离了.那么,这个时候,就需要去配置多数据源了.那么具体如何配 ...

  8. 关于mapper接口注入spring容器

    mapper是接口,而接口时不能注入spring容器的,要注入就需要接口有对应的实现类,注入的应该是实现类而不是接口 而在spring中,导入MyBatis-Spring包之后,MyBatis-Spr ...

  9. springboot 中 mybatis configuration 配置失效问题

    springboot 中 mybatis configuration 配置失效问题 环境 场景 springboot角度分析 SqlSessionFactory 设置Configuration Myb ...

最新文章

  1. 二级域名做SEO优化有怎样的利弊关系?
  2. WPS for Linux【Debian、Ubuntu、Deepin、Linux Mint】字体缺失解决【批量字体安装】
  3. python量化数据处理小细节(以后还会不断补充)
  4. 数组正遍历,数组倒遍历
  5. vue-cli+webpack打包配置
  6. filter笔记(主要看到黑马教程的ppt)
  7. 现阶段的主流数据库分别是哪几种?
  8. Java实现附近地点搜索
  9. Oracle误删除dbf文件和表空间恢复
  10. css 侧栏跟随_JS+CSS实现侧边栏跟随浏览器滚动效果
  11. QPainter 画扇形
  12. 21 07 13学习总结
  13. js调用android.webkit,h5调用原生App的方法合集 window.webkit.messageHandlers
  14. omv检查硬盘坏道_技术员们有福了,关于怎么用MHDD修复硬盘坏道,现在免费给大家了!!!...
  15. mysql数据源配置
  16. 办公文书处理属于计算机应用中的,电大计算机应用基础总结基础知识单选题
  17. iOS10集成siri
  18. 【HTCVR】VRTK插件功能
  19. Linux下VCS/IRUN的操作命令
  20. 【Python训练营】Python每日一练----第6天:迷宫

热门文章

  1. flash 编程技巧应用 原创
  2. Kindeditor富文本编辑器使用
  3. 机械硬盘提示操作无法完成,因为磁盘管理控制台视图不是最新状态要如何办啊...
  4. jquery 中后代遍历之children、find区别
  5. 20161207py学习笔记
  6. 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
  7. mac 雪豹 10.6 五国
  8. 【Hibernate】getHibernateTemplate.find()和session.createQuery()方法总结
  9. scala:异常处理(try/catch)
  10. 《算法设计手册》面试题解答 第四章:排序和搜索