MyBatis工作原理及循环依赖

Posted zjh0101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis工作原理及循环依赖相关的知识,希望对你有一定的参考价值。

  1. MyBatis中#和$的区别

# 是预编译处理

$ 是字符串替换。

Mybatis在处理#时,会将sql中的#替换为?号,调用PreparedStatementset方法来赋值;

Mybatis在处理$时,就是把$替换成变量的值。

使用#可以有效的防止SQL注入,提高系统安全性。

2.ApplicationContext和BeanFactory的区别

BeanFactory

spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的

BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。

ApplicationContext

ApplicationContext接口是由BeanFactory接口派生而来,因而具有BeanFactory所有的功能。

ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,

ApplicationContext包还提供了以下的功能

1. MessageSource, 提供国际化的消息访问

2. 资源访问,如URL和文件

3. 事件传播

4. 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web

,其实通过上面的类图大家应该也能看的出来BeanFactoryApplicationContext的区别的。

3.MyBatis的工作原理

1读取 MyBatis 配置文件:mybatis-config.xml  MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

2加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在

MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

3构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory

4创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

5Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

6MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数, 该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

7输入参数映射:输入参数类型可以是 MapList 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC  preparedStatement 对象设置参数的过程。

8输出结果映射:输出结果类型可以是 Map List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程

4.Spring中的循环依赖

循环依赖,就是两个或则两个以上的bean互相依赖对方,最终形成闭环。比如“A对象依赖B对象,而B对象也依赖A对象”,或者“A对象依赖B对象,B对象依赖C对象,C对象依赖A对象”;类似以下代码:

public class A

    private B b;

public class B

    private A a;

常规情况下,会出现以下情况:

通过构建函数创建A对象(A对象是半成品,还没注入属性和调用init方法)。

A对象需要注入B对象,发现对象池(缓存)里还没有B对象(对象在创建并且注入属性和初始化完成之后,会放入对象缓存里)。

通过构建函数创建B对象(B对象是半成品,还没注入属性和调用init方法)。

B对象需要注入A对象,发现对象池里还没有A对象。

创建A对象,循环以上步骤。

Spring 循环依赖的场景有两种:

构造器的循环依赖。

field 属性的循环依赖。

对于构造器的循环依赖,Spring 是无法解决的,只能抛出 BeanCurrentlyInCreationException 异常表示循环依赖,所以下面我们分析的都是基于 field 属性的循环依赖。

Spring 只解决 scope 为 singleton 的循环依赖。对于scope 为 prototype 的 bean ,Spring 无法解决,直接抛出 BeanCurrentlyInCreationException 异常。

以上是关于MyBatis工作原理及循环依赖的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务源码分析专题Mybatis的使用及跟Spring整合原理分析

MyBatis的工作原理

Mybatis 工作原理详解

阅读随笔 SpringMybatis

02-Mybatis工作原理

mybatis循环插入数据问题