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

news2024/10/2 10:26:05

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.coloradmin.cn/o/484700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode-1003. 检查替换后的词是否有效

题目链接 LeetCode-1003. 检查替换后的词是否有效 题目描述 题解 题解一(Java) 作者:仲景 题挺难懂的,很绕,然后读懂了就很简单了 就是说本来是一个字符串s,abc三个字符可以随便放在s原本字符串的左边或…

删除游戏-类似打家劫舍

198. 打家劫舍 - 力扣(LeetCode) 1 熟悉打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被…

java+微信小程序,实现chatgpt聊天小程序

chatgp持续火爆,然鹅会用的人其实挺少的,现在使用异步请求的方式,基本可以实现秒回复。并且还基于webSocket编写了一个微信小程序来进行交互,可以直接使用微信小程序来进行体验。 现在我将所有代码都上传了github(链接在文章结尾),大家可以clone下来,部署到服务器上,真…

shell命令

shell命令 打开文本编辑器(可以使用vi/vim创建文本),新建一个test.sh文件,输入一些代码,第一行为固定写法 #!/bin/bash echo hello word#!是一个约定的标记,他告诉系统这个脚本使用什么解释器执行 shell中注释 1.单行注释使用# 2.多行注释…

在Linux服务器上(非root权限)配置anaconda和pytorch的GPU环境

本人小白一枚,加入了导师的课题组之后使用学校的服务器开始炼丹,但是光是配环境就花了好几天,特此记录下。。。。 选择你趁手的工具 链接远程服务器的终端工具有很多,例如xshell等,我选择是的finalshell 下载教程 【…

敏捷ACP.敏捷估计与规划.Mike Cohn.

第一部分 传统规划失败的原因 vs 敏捷规划有效的原因 传统的项目规划方式往往会让我们失望。要回答-一个 新产品的范围/进度/资源的组合问题,传统规划过程不一定会产生令人非常满意的答案和最终产品。以下- -些论据可以支持这个结论: ●大约2/3的项目会显著超…

Linux设备驱动模型(一)

一、sysfs文件系统 sysfs是一个虚拟文件系统,将内核总的设备对象的链接关系,以文件目录的方式表示出来,并提对设备的供读写接口。 二、kobject kobject是内核中对象表示的基类,可以认为所有的内核对象都是一个kobject kobject单…

Docker 持久化存储 Bind mounts

Docker 持久化存储 Bind mounts Bind mounts 的 -v 与 --mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档:https://docs.docker.com/storage/bind-mounts/ Bind mounts 的 -v 与 --mount 区别 如果使用…

Origin如何使用基础功能?

文章目录 0.引言1.菜单栏2.工具栏 0.引言 因科研等多场景需要进行绘图处理,笔者对Origin进行了学习,本文通过《Origin 2022科学绘图与数据》及其配套素材结合网上相关资料进行学习笔记总结,本文对软件界面基础功能进行阐述。    1.菜单栏 …

【Linux内核解析-linux-5.14.10-内核源码注释】内核源码中宏定义理解

内核宏定义1 这是Linux内核中的start_kernel函数的一部分代码。它的作用是初始化内核的一些基本组件和数据结构。 asmlinkage: 这是一个函数声明修饰符,指示编译器把函数参数放在堆栈中,而不是寄存器中。 __visible: 这是另一个函数声明修饰符&#x…

第二十六章 碰撞体Collision(上)

在游戏世界中,游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如,攻击怪物则是主角与怪物的碰撞,触发机关则是主角与机关的碰撞。在DirectX课程中,我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

生成模型经典算法-VAEGAN(含Python源码例程)

生成模型 文章目录 生成模型1. 概述2. 生成模型典型结构-VAE&GAN2.1 VAE2.1.1 简介2.1.2 模型处理流程 2.2 GAN2.2.1 简介 2.2.2 生成对抗网络要点2.2.3 生成对抗网络的训练准则2.2.4 生成对抗网络模型处理流程 3.生成模型和判别模型在AIGC中的应用3.1 生成模型在AIGC中的应…

【SQL】面试篇之排序和分组练习

1587 银行账户概要 II 1587题目 # Write your MySQL query statement below select name, balance from (select u.account, name, sum(amount) as balancefrom Users uleft join Transactions ton u.account t.accountgroup by u.account ) temp where balance > 10000总…

给定一个文本文件,每行是一条股票信息,写程序提取出所有的股票代码

问题:给定一个文本文件,每行是一条股票信息,写程序提取出所有的股票代码。其中,股票代码规则是:6 位数字, 而且以.SH 或者.SZ 结尾。 文件内容示例: 2020-08-08;平安银行(000001.SZ);15.55;2940…

( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

❓645. 错误的集合 难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了…

教你如何快速安装下载EasyRecovery16最新版本

最近辛辛苦苦写的PPT报告被手残的我一个不小心给删除了,本来在空调屋里懂得瑟瑟发抖的我瞬间后背就被汗水浸湿了,好在懂点计算机知识,没有继续乱操作,在使用EasyRecovery后很快就找回来了! EasyRecovery 16(有几个版本…

Git(六):基本命令(3):储藏、标签、拉取、子模块

目录 17、stash 储藏 17.2 描述 17.3 基本用法 18、tag 标签 18.1 描述 18.2 基本用法 19、fetch 获取 19.1 描述 19.2 基本用法 20、pull 整合 20.1 描述 20.2 基本用法 20.3 pull 与 fetch 的区别 21、push 更新推送 21.1 描述 21.2 基本用法 22、remote 管…

Vue性能优化

目录 Vue性能优化的必要性:Vue项目优化工具webpack-bundle-analyzerwebpack-bundle-analyzer作用:webpack-bundle-analyzer用法:webpack-bundle-analyzer运行:webpack-bundle-analyzer使用: vue项目性能优化代码模块化…

Tensorflow入门图像分类-猫狗分类-安卓

最近在温习 Tensorflow,写了一篇笔记,记录了使用 Tensorflow 训练一个猫狗图像分类器的模型并在安卓应用上使用的全过程。 一、数据集准备 1.1 数据集来源 我采用的是微软的猫狗数据集,链接:Download Kaggle Cats and Dogs Datas…

2023华中杯数学建模C题完整模型代码

已完成全部模型代码,文末获取。 摘要 随着工业化和城市化的快速发展,空气污染已经成为全球性的环境问题。细颗粒物(PM2.5)等污染物对人类健康、生态环境和社会经济造成了严重影响。本研究旨在深入探究影响PM2.5浓度的主要因素&a…