Spring源码解读——高频面试题

Spring  IoC的底层实现

1.先通过createBeanFactory创建出一个Bean工厂(DefaultListableBeanFactory)

2.开始循环创建对象,因为容器中的bean默认都是单例的,所以优先通过getBean、doGetBean从容器中查找,如果找不到的话;

3.通过createBean、doCreateBean方法,以反射的方式创建对象(一般情况下使用的是无参的构造方法),getDeclaredConstructor、newInstance

4.进行对象的属性填充populateBean(自定义属性赋值)、initializeBean(容器对象的属性赋值)

三级缓存的放置时间和删除时间

三级缓存:createBeanInstance之后(addSingletonFactory方法)

二级缓存:第一次从三级缓存确定对象是代理对象还是普通对象的时候,放入二级缓存同时删除三级缓存(getSingleton方法)

一级缓存:生成完整成品对象之后放入一级缓存,同时删除二级和三级缓存(addSingleton方法)

Spring中用到的设计模式

单例模式:Bean默认都是单例的;

原型模式:指定作用域为prototype;

工厂模式:BeanFactory;

模板方法模式:postProcessBeanFactory,onRefresh,initPropertyValue,等等,体现了Spring的扩展性;

策略模式:XmlBeanDefinitionReader,PropertiesBeanDefinitionReader;

观察者模式:Listener,event,multicast;

适配器模式:Adpater,.....AdviceAdpater;

装饰者模式:BeanWrapper;

责任链模式:使用aop的时候会先生成一个拦截器链

代理模式:动态代理;

委托者模式:delegate;

Spring的事务是如何回滚的

也就是问Spring的事务管理是如何实现的?

我们都知道事务是Aop里面的经常使用的,并且很关键的一个应用场景,但是我们光回答Aop是不够的;

其实整个事务的流程无非就是下面这样

如果是我们自己来实现,准备工作:我们可以使用beforeAdvice来处理,在执行成功之后我们可以使用afterAdvice来处理,如果执行失败了我们可以使用afterThrowing来处理;

但是如果每个事务都这样来做的话就太麻烦了,因为这里面有一堆通知,它必然会构成一个链式结构;

因此我们可以把这些合并到一起去,形成一个完整的结构;

总:spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,正常情况下要通过通知来完成核心功能,但是在aop中事务不是通过通知来实现的,而是通过一个TransactionInterceptor来实现的,它会调用里面的invoke方法来实现具体的逻辑

 

分:

1.先做准备工作,解析各个方法上事务相关的属性,根据具体的属性来判断是否开始新事务;

2.当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务;

3.执行具体的逻辑操作;

4.在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing方法完成事务的回滚操作,回滚的具体逻辑是通过doRollBack方法来实现的,实现的时候也是要先获取连接对象,通过连接对象来回滚

5.如果执行过程中,没有任何意外情况的发生,那么通过commitTransactionAfterReturning方法来完成事务的提交操作,具体逻辑是通过doCommit方法来实现的,实现的时候也是要先获取连接对象,通过连接对象来提交

6.当事务执行完毕之后需要清楚相关的事务信息,通过cleanupTransactionInfo方法

 

rollback=>processRollBack=>doRollBack;

commit=》processCommit=》doCommit;

 

 

 如果想要聊的更加细致的话,需要知道TransactionInfo,TransactionStatus(比较复杂);

Spring的事务传播

有七种传播特性;

PROPAGATION_REQUIRES:默认的Spring事务传播级别,若当前存在事务,则加入该事务,若不存在事务,则新建一个事务

PROPAGATION_REQUIRE_NEW:若当前没有事务则新建一个事务,若当前存在事务则新建一个事务,新老事务相互独立,外部事务抛出异常回滚不会影响内部事务的正常提交

PROPAGATION_NESTED:若当前存在事务,则嵌套在当前事务中执行,若当前没有事务则新建一个事务,类似于REQUIRE_NEW

PROPAGATION_SUPPORTS:支持当前事务,若当前不存在事务,则以非事务的方式执行

PROPAGATION_NOT_SUPPORTED:以非事务的方式执行,若当前存在事务,则把当前事务挂起

PROPAGATION_MANDATORY:强制事务执行,若当前不存在事务,则抛出异常

PROPAGATION_NEVER:以非事务的方式执行,若当前存在事务则抛出异常

某一个事务嵌套另一个事务的时候怎么办?

A方法调用B方法,AB方法都有事务,并且传播特性不同,如果A/B有异常、B/A怎么办?

总:事务的传播特性指的是不同方法的嵌套调用过程中,事务应该如何进行处理,是用同一个事务还是不同的事务,当出现异常的时候是会回滚还是提交,这两个方法之间的相互影响,在日常工作中,使用比较多的是Required,Requires_new,nested;

分:

1.先说事务的不同分类,可以分为三类:支持当前事务,不支持当前事务,嵌套事务

2.如果外层方法是Required,内层方法是Required,Requires_new,nested

3.如果外层方法是Requires_new,内层方法是Required,Requires_new,nested

4.如果外层方法是nested,内层方法是Required,Requires_new,nested

核心处理逻辑非常简单:

1.判断内外方法是否是同一个事务;

1.1 如果是同一个事务,异常统一在外层方法处理

1.2 如果不是同一个事务,内层方法有可能影响到外层方法,但是外层方法是不会影响内层方法的

(大致可以这么理解,但是有个别情况不同,例如nested

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/17176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QML状态与过渡(States and Transitions)

目录 一 状态(States) 一 过渡(Transitions) 通常我们将用户界面描述为一种状态。一个状态定义了一组属性的改变,并且会在一定的条件下被触发。另外在这些状态转化的过程中可以有一个过渡,定义了这些属性…

SpringBoot+vue文件上传下载预览大文件分片上传文件上传进度

文章目录 学习链接上传文件前端后端代码 下载文件a标签下载前端代码后台代码 动态a标签下载前端代码 axios 动态a标签前端代码 浏览器直接输入 预览文件前端代码后端代码 分片上传前后端分别md5加密spark-md5commons-codec 分片上传实现1前端代码后端代码 分片上传实现2前端代…

Spark RDD 持久化(CheckPoint 检查点)

RDD Cache 缓存 RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存 在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的 action 算 子时,该 RDD 将会被缓存在计算节点的内存中 // cach…

常用排序算法汇总—Python版

一、选择排序 1. 原理: 选择排序(Selection Sort)是一种简单直观的排序算法,它的基本思路是将数组按顺序分成已排序部分和未排序部分,然后每次从未排序部分中选择出最小的元素,将其添加到已排序部分的末尾…

【五一创作】【软考:软件设计师】 5 计算机组成与体系结构(三)认证技术 | 计算机可靠性

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于软考中级:软件设计师系列专栏,本专栏服务于软考中级的软件设计师考试,包括不限于知识点讲解与真题讲解两大部分,并且提供电子教材与电子版真题,关注私聊即可 …

三范式(详解+例子)

第一范式(1NF):每一列都是不可分割的原子数据项(什么意思,每一项都不可分割,像下面的表格就能分割,所以它连第一范式都算不上) 分割后的样子 (它就是第一范式了&#xff…

FPGA学习_01_基础知识(有点劝退,心灵弱小者勿入)

有些人喜欢直接拿开发板看教程开干,我认为了解点历史发展没什么坏处,一些FPGA的基础知识也是同样重要的。 1.1. FPGA的主要厂商 XILINX 占据FPGA绝大部分的市场份额 ALTERA 被 INTEL 167亿美元收购 改名为INTEL LATTICE 被神秘的中国公…

HMM理论学习笔记-隐马尔可夫模型的三个元素、假设和问题

文章目录 概率论基础条件概率全概公式边缘概率联合概率联合概率与边缘概率的关系贝叶斯公式(条件联合概率)马尔科夫链的概念 HMM简述HMM的三个元素符号定义1、状态转移概率矩阵A2、观测概率矩阵B3、初始状态概率向量π HMM的三个假设1、齐次马尔可夫假设…

Spring Boot使用(基础)

目录 1.Spring Boot是什么? 2.Spring Boot使用 2.1Spring目录介绍 2.2SpringBoot的使用 1.Spring Boot是什么? Spring Boot就是Spring脚手架,就是为了简化Spring开发而诞生的 Spring Boot的优点: 1.快速集成框架,提供了秒级继承各种框架,提供了启动添加依赖的功能 2.内…

简单搭建node后台(笔记用)

毕设过程 mongodb 配置 使用node写后台一些语法运用bug关于安装一款群控软件后,修改了环境变量导致后台崩溃![](https://img-blog.csdnimg.cn/7c684b2e318048b3ad1db78484e10e6a.jpeg) vue管理后台 mongodb 配置 https://blog.csdn.net/weixin_43405300/article/de…

【SPSS】相关分析和偏相关分析详细操作过程(附案例实战)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

java的spi机制使用场景讲解和具体使用

八股文背多了,相信大家都听说过一个词,SPI扩展。 有的面试官就很喜欢问这个问题,SpringBoot的自动装配是如何实现的? 基本上,你一说是基于spring的SPI扩展机制,再把spring.factories文件和EnableAutoConf…

C++(多态上)

目录: 1.多态的概念 2.多态的定义和实现 3.虚函数构成重写的特例 4.剖析一道非常经典的题 5.剖析多态的原理 ------------------------------------------------------------------------------------------------------------------------- 1.多态的概念 概念:通俗来说&#…

Word2vec原理+实战学习笔记(二)

来源:投稿 作者:阿克西 编辑:学姐 前篇:Word2vec原理实战学习笔记(一)​​​​​​​ 视频链接:https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6 5 对比模型(论文Mod…

Python使用AI photo2cartoon制作属于你的漫画头像

Python使用AI photo2cartoon制作属于你的漫画头像 1. 效果图2. 原理3. 源码参考 git clone https://github.com/minivision-ai/photo2cartoon.git cd ./photo2cartoon python test.py --photo_path images/photo_test.jpg --save_path images/cartoon_result.png1. 效果图 官方…

(22)目标检测算法之 yolov8模型导出总结

yolov8模型导出总结 不断更新中… 几种部署情况: onnxxmlengine官网说明:https://github.com/ultralytics/ultralytics/blob/main/docs/modes/export.md导出参数: onnx 参数解析format: 导出的模型形式:onnx xml engine ... imgsz: 设置模型的输入尺寸大小,默认640*640 ke…

磁盘和固态磁盘

磁盘和固态磁盘 磁盘的物理结构 ​ 磁盘的表面由一些磁性的物质组成,可以用这些磁性物质来记录二进制数据。磁盘的盘面被划分成一个个磁道,这样一个“圈”就是一个磁道。同一磁盘上不同磁道上记录的信息量相同,因此内侧磁道上的数据密度较大…

STM32F429移植microPython笔记

目录 一、microPython下载。二、安装开发环境。三、编译开发板源码。四、下载验证。 一、microPython下载。 https://micropython.org/download/官网 下载后放在linux中。 解压命令: tar -xvf micropython-1.19.1.tar.xz 二、安装开发环境。 sudo apt-get inst…

【Java笔试强训 14】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥计算日期…

玩着3dmax把Python学了-01

3ds Max 2022以前的版本要借助Python的api来实现Python编程达到编辑绘图脚本的功能,但是好消息来了,3ds Max 2022 起,MaxPlus 不再作为 3ds Max 的 Python API 包含在内。而是3ds Max 将 Python 3.7 的标准版本包涵其中了,位于 [3…
最新文章