面试题总结(mybatis一级缓存及二级缓存、springboot自动装配原理等)
1.mybatis一级缓存及二级缓存
区别:
- 一级缓存的作用域是一个sqlsession内;
- 二级缓存作用域是针对mapper(Namespace)进行缓存;
一级缓存:
在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
缓存何时清空:
一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。
二级缓存:
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
1、在配置文件中 开启二级缓存的总开关
<setting name="cacheEnabled" value="true" />
2、 在mapper映射文件中开启二级缓存
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
参数名属性:eviction收回策略、flushInterval刷新间隔、size引用数目、readOnly只读
3、实体类实现Serializable
2.springboot自动配置的原理
简单来说,Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器中。
三大注解详解:
SpringBoot的核心注解@SpringBootApplication
@ComponentScan:
默认扫描该类所在包及其子包下所有带有指定注解的类,将它们自动装配到bean容器中;
会被自动装配的注解包括@Controller、@Service、@Component、@Repository等
@SpringBootConfiguration:
继承自Configuration,支持JavaConfig的方式进行配置
@EnableAutoConfiguration(核心重点)
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)重点
详解@Import
1.AutoConfigurationImportSelector类中有一个selectImports()方法
@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {//检查自动配置功能是否开启,默认开启if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}//加载自动配置的元信息AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AnnotationAttributes attributes = getAttributes(annotationMetadata);//获取候选配置类List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);//去掉重复的配置类configurations = removeDuplicates(configurations);//获得注解中被exclude和excludeName排除的类的集合Set<String> exclusions = getExclusions(annotationMetadata, attributes);//检查被排除类是否可实例化、是否被自动注册配置所使用,不符合条件则抛出异常checkExcludedClasses(configurations, exclusions);//从候选配置类中去除掉被排除的类configurations.removeAll(exclusions);//过滤configurations = filter(configurations, autoConfigurationMetadata);//将配置类和排除类通过事件传入到监听器中fireAutoConfigurationImportEvents(configurations, exclusions);//最终返回符合条件的自动配置类的全限定名数组return StringUtils.toStringArray(configurations);
2.如何得到候选的配置类
getCandidateConfigurations()得到,并最终由一个列表保存,候选的配置类还要经过一系列的去重、排除、过滤;
3.SpringFactoriesLoader.loadFactoryNames()
发现一个获取资源的地址:META-INF/spring.factories
spring.factories文件,Map<String,List<String>>其中Key:org.springframework.boot.autoconfigure.EnableAutoConfiguration,Value:各种XXXAutoConfiguration类;
简述以上过程就是:
getCandidateConfigurations()方法通过SpringFactoriesLoader加载器加载META-INF/spring.factories文件,首先通过这个文件获取到每个配置类的url,再通过这些url将它们封装成Properties对象,最后解析内容存于Map<String,List<String>>中。
面试题总结(mybatis一级缓存及二级缓存、springboot自动装配原理等)相关推荐
- 深入理解MyBatis一级缓存和二级缓存【超详细源码解析】
视频地址:https://www.bilibili.com/video/BV1nP411A7Gu MyBatis的缓存是一个常见的面试题 一级缓存的作用域为何是 sqlSession.二级缓存的作用域 ...
- Mybatis一级缓存,二级缓存的实现就是这么简单
介绍 又到了一年面试季,所以打算写一点面试常问的东西,争取说的通俗易懂.面试高级岗,如果你说熟悉Mybatis,下面这些问题基本上都会问 Mybatis插件的实现原理? 如何写一个分页插件? Myba ...
- mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存
设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --><settings& ...
- MyBatis框架:延迟加载策策略、一级缓存、二级缓存
MyBatis框架:延迟加载策略和缓存 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用association实现延迟加载 1.3.1 账户的持久层DAO接口 1. ...
- 浅谈Mybatis的一级缓存和二级缓存
MyBatis的缓存机制 缓存的引入 当我们大量执行重复的查询SQL语句的时候,会频繁的和数据库进行通信,会增加查询时间等影响用户体验的问题,可以通过缓存,以降低网络流量,使网站加载速度更快. MyB ...
- MyBatis】MyBatis一级缓存和二级缓存
转载自 MyBatis]MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存.一级缓存的作用域默认是一个SqlSe ...
- Mybatis 详解--- 一级缓存、二级缓存
2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...
- Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
文章目录 一级缓存 二级缓存 总结 对于一名程序员,缓存真的很重要,而且缓存真的是老生常谈的一个话题拉.因为它在我们的开发过程中真的是无处不在.今天LZ带大家来看一下.Mybatis是怎么实现一级缓存 ...
- 框架源码专题:Mybatis的一级缓存、二级缓存是什么?有什么作用?
文章目录 1. Mybatis中缓存的作用 2. 一级缓存 3. 二级缓存 4. 一级缓存和二级缓存的区别 5. 通过代码观察Mybatis缓存工作的全过程 1. Mybatis中缓存的作用 首先缓存 ...
最新文章
- C++语言学习(十二)——C++语言常见函数调用约定
- matlab中任意两边之和大于第三边,无法赋值,左侧大小1*1,右侧1*3,代码报错,但是看不出来两边大小不相等啊...
- 第jiu届蓝桥杯单片机省赛真题_第九届蓝桥杯单片机组省赛试题.pdf
- 标题:	Huffman树
- 程序包androidx.support.annotation不存在/import android.support.annotation.NonNull;报错
- 第十二届蓝桥杯模拟赛Python组(第一期)
- VB计算机中next是什么意思,VB程序的基本结构――循环结构之For-Next语句
- 明辰智航发布流量分析审计系统
- Sass 入门(基础知识点汇总)
- C++ 复数计算器 简单代码
- 全面理解面向对象的 JavaScript(转载)
- 深信服edr终端漏洞
- wordpress采集插件-wordpress关键词插件-wordpress百度推送插件-wordpress蜘蛛统计分析插件
- 人工智能和计算机视觉(5)-边缘检测
- 大话数据结构笔记-图
- SLE46C-40.K44P-M12安全传感器
- zynq 烧写W25Q256FV Flash步骤
- 基于自适应最优多评价神经模糊控制的MIMO人体肌肉骨骼臂模型
- 如何留住vscode运行框?
- SQL DML 数据操纵语句
热门文章
- 创建用户注册接口时的两个小问题
- SQL 删除数据库文件,删除SQL文件 无法删除 文件‘NEWDB2021‘,因为它不为空
- 星球日报 | 英伟达70亿美元收购同行公司;XRPL Labs推出针对WooCommerce项目开发人员的奖励基金...
- neosemantics的bug汇总
- Tiktok免越狱群控 分享Tiktok引流变现矩阵玩法
- jdbc 的连接方式 thin, oci
- 数据分析手把手入门:打造自己的股票分析系统
- 软件测试的基本过程共有几个步骤?
- 04-CSS选择器:伪类
- Python实验四 Python序列结构