MyBatis工作原理及循环依赖
Posted zjh0101
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis工作原理及循环依赖相关的知识,希望对你有一定的参考价值。
- MyBatis中#和$的区别
# 是预编译处理
$ 是字符串替换。
Mybatis在处理#时,会将sql中的#替换为?号,调用PreparedStatement的set方法来赋值;
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
层,其实通过上面的类图大家应该也能看的出来BeanFactory和ApplicationContext的区别的。
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 语句的所有方法。
5、Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6、MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数, 该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7、输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 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工作原理及循环依赖的主要内容,如果未能解决你的问题,请参考以下文章