八股文之框架篇(Spring Boot、SSM)

文章目录

    • Spring中的单例bean是线程安全的吗
    • 什么是AOP,项目中有没有使用到AOP
    • Spring中的事务是如何实现的
    • Spring中事务失效的场景有哪些
    • Bean的生命周期
    • Spring中的循环依赖(循环引用)
    • SpringMVC的执行流程
    • SpringBoot自动配置原理
    • Spring、SpringMVC、SpringBoot常见注解
    • MyBatis执行流程
    • MyBatis是否支持延迟加载
    • 延迟加载的原理
    • MyBatis的一级、二级缓存
    • MyBatis的二级缓存什么时候会清理缓存中的数据

Spring中的单例bean是线程安全的吗

不是线程安全的。在并发执行请求的情况下,如果该请求的业务逻辑中存在对单例bean的修改、成员变量的修改,则要考虑线程安全问题,而且Spring并没有提供bean的线程安全策略。在Spring中可以使用@Scope注解来指定bean的生命周期,模式有singleton、prototype、request、session、global session,第一种指定的是单例bean、第二种指定的是多例bean,默认是单例bean。在Spring中的bean大多数是被注入无状态的对象,没有线程安全问题,如果定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例bean、加锁、ThreadLocal来解决部分问题,最后,尽量不要在bean中定义成员变量。

什么是AOP,项目中有没有使用到AOP

AOP称为面向切面编程,用于那些与业务无关的,却和多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被称为”切面(Aspect)“,减少系统中的重复代码,降低模块之间的耦合度,同时提高了系统的可维护性,常见的使用场景有:记录操作记录、缓存处理、Spring中内置的事务处理(编程式事务、声明式事务)、公共字段的填充等等。

Spring中的事务是如何实现的

本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行目标方法后根据执行情况提交或回滚事务。

Spring中事务失效的场景有哪些

  1. 异常捕获处理:事务通知只有捕获目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理了异常,事务后续的回滚则不进行,导致事务失效,在这种情况下,如果希望事务不失效,那我们应该让事务感知到异常,所以我们在catch块中添加抛出异常即可,throw new RuntimeException(e)
  2. 抛出检查异常(checked exceptions):Spring默认只会回滚非检查异常,在这种情况下我们希望事务不失效,可以指定检查的异常为所有异常,这样只要是异常,事务都会生效,@Transactional(rollbackFor = Exception.class)
  3. 非public方法导致的事务失效:因为Spring为方法创建代理、添加事务通知,前提条件都是该方法是public的,所以希望在这种情况下事务不失效,把方法改为public的即可。

Bean的生命周期

  1. 手写Spring中Bean的生命周期:https://github.com/openallzzz/spring-openallzzz
  2. 调用BeanDefinition获取bean的定义信息(获取beanDefinition的class信息)
  3. 调用构造函数实例化bean(反射调用:clazz.getDeclaredConstructor().newInstance()
  4. bean的依赖注入(反射获取属性,判断属性是否存在注解@Autowired
  5. 处理aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware
  6. Bean的后置处理器BeanPostProcessor-前置(postProcessBeforeInitialization)
  7. 初始化方法(重写InitializingBean中的afterPropertiesSet方法、init-method)
  8. Bean的后置处理器BeanPostProcessor-后置(postProcessAfterInitialization)
  9. 销毁bean

Spring中的循环依赖(循环引用)

就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A。
循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖(非构造方法产生的)

  1. 一级缓存:单例池,缓存已经经历了完整的生命周期,已经被初始化完成的bean对象
  2. 二级缓存:缓存早期的bean对象(生命周期还没走完)
  3. 三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

构造方法出现了循环依赖的解决方案,spring框架并不能解决构造函数的循环依赖,我们可以使用@Lazy注解进行懒加载,什么时候需要对象再进行bean对象的创建。

SpringMVC的执行流程

  1. 视图阶段(JSP、Thymeleaf):
    在这里插入图片描述
    在这里插入图片描述

  2. 前后端分离阶段(接口开发、异步):
    在这里插入图片描述
    在这里插入图片描述

SpringBoot自动配置原理

在这里插入图片描述

Spring、SpringMVC、SpringBoot常见注解

  1. Spring
    在这里插入图片描述
  2. SpringMVC
    在这里插入图片描述
  3. SpringBoot
    在这里插入图片描述

MyBatis执行流程

在这里插入图片描述

MyBatis是否支持延迟加载

支持延迟加载,但默认是关闭的。对于延迟加载的定义,这里举一个例子,用户实体中存在订单属性,如果我们在查询用户的时候,把用户所属的订单数也查询出来,这个就是立即加载;如果在查询用户的时候,暂时不查询订单数据,当需要订单数据的时候,再查询订单,这个就是延迟加载。

延迟加载的原理

在这里插入图片描述

MyBatis的一级、二级缓存

在这里插入图片描述
注意开启二级缓存需要在配置文件中开启cacheEnabled=true,并且在相应的mapper.xml文件中使用<cache/>标签,相关select语句的参数 useCache=true,相关的实体类需要实现序列化接口,数据才会被加入到二级缓存。

MyBatis的二级缓存什么时候会清理缓存中的数据

详细解答:https://blog.csdn.net/jinbaizhe/article/details/81158514
当某一个作用域(一级缓存Session / 二级缓存namespace)进行了写操作(新增、修改、删除)操作,默认该作用域下所有select中的缓存将被清空。

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

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

相关文章

生信豆芽菜-差异基因富集分析

网址&#xff1a;http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析&#xff0c;注意这个的关键基因集可以是差异基因&#xff0c;WGCNA的module基因&#xff0c;也可以是表型相关的基因集 1、数据准备 准备一个基因…

kubernetes企业级高可用部署

目录 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 2.3、项目实施思路 3、项目实施过程 3.1、系统初始化 3.2、配置部署keepalived服务 3.3、…

【Android Studio】 win11 安装配置 jdk17 超详细

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…

如何在 iOS 上安装并使用 ONLYOFFICE 文档

借助 iOS 版文档应用&#xff0c;您可在移动端设备上访问存储于 ONLYOFFICE 账户中的文件&#xff0c;查看和编辑现有文本文档、电子表格和演示文稿&#xff0c;创建新文档并对其进行整理&#xff0c;以及连接第三方云存储服务。您可与其他门户网站用户协作编辑文档&#xff0c…

16.5.4 【Linux】SELinux 政策内的规则管理

SELinux 各个规则的布林值查询 getsebool 如果想要查询系统上面全部规则的启动与否 &#xff08;on/off&#xff0c;亦即布林值&#xff09;&#xff0c;很简单的通过 sestatus-b 或 getsebool -a 均可&#xff01; SELinux 各个规则规范的主体程序能够读取的文件 SELinux typ…

QT QtXlsx安装使用

QtXlsx介绍 QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel&#xff0c;可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。 须知安装QtXlsx时&#xff0c;需要下载perl 1.安装perl 这里选择官网下载安装即可。 官网地址&#xff1a;https://p…

【Git】(四)子模块

1、增加子模块 进入准备添加子模块所在的目录&#xff0c;例如library。 git submodule add -b 1.0.0.0 gitgitee.com:sunriver2000/SubModule.git参数-b用于指定子模块分支。 2、更新子模块 git submodule update --progress --init --recursive --force --remote -- "…

Sending a Sequence Over the Network

一、题目 题面翻译 你现在有一个序列 a a a&#xff0c;定义一个用该序列生成新序列 b b b 的规则如下&#xff1a; 把 a a a 这个序列分成连续的几段&#xff1b;对于每一段&#xff0c;我们把这一段的长度插入到这一段的左边或右边。每一段进行操作后便得到了 b b b 序…

《零基础7天入门Arduino物联网-04》电路基础知识上

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 直流电与交流电 直流电&#xff08;DC&#xff09; 是指电流的方向始终保持不变的电流。这意味着…

什么是可视化编程?为什么它如此重要?

可视化编程&#xff0c;又叫可视化程序设计&#xff0c;一直以来就是备受讨论的“热门技术”。一方面&#xff0c;程序员抵触它&#xff0c;觉得它不如用代码开发。另一方面&#xff0c;对于产品经理等稍微懂点开发的业余人员&#xff0c;它确实能提供价值。所以&#xff0c;它…

LeetCode 1572. 矩阵对角线元素的和

【LetMeFly】1572.矩阵对角线元素的和 力扣题目链接&#xff1a;https://leetcode.cn/problems/matrix-diagonal-sum/ 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&…

数据可视化和数字孪生相互促进的关系

数据可视化和数字孪生是当今数字化时代中备受关注的两大领域&#xff0c;它们在不同层面和领域为我们提供了深入洞察和智能决策的机会&#xff0c;随着两种技术的不断融合发展&#xff0c;很多人会将他们联系在一起&#xff0c;本文就带大家浅谈一下二者之间相爱相杀的关系。 …

Maven方式构建SpringBoot项目

目录 1、创建maven项目 2、添加springboot相关依赖 3、配置启动端口 4、修改APP文件 5、配置controller 6、启动应用 1、创建maven项目 项目如下&#xff1a; 2、添加springboot相关依赖 <parent><groupId>org.springframework.boot</groupId><arti…

自动化安装系统(二)

利用PXE实现自动化安装 PXE简介 PXE&#xff1a;Preboot Excution Environment&#xff0c;预启动执行环境&#xff0c;是由Intel公司研发&#xff0c;基于Client/Server的网络模式&#xff0c;支持远程主机通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操…

小白到运维工程师自学之路 第七十三集 (kubernetes应用部署)

一、安装部署 1、以Deployment YAML方式创建Nginx服务 这个yaml文件在网上可以下载 cat nginx-deployment.yaml apiVersion: apps/v1 #apiVersion是当前配置格式的版本 kind: Deployment #kind是要创建的资源类型&#xff0c;这里是Deploymnet metadata: #metadata是该资源…

Django笔记之数据库函数之日期函数

日期函数主要介绍两个大类&#xff0c;Extract() 和 Trunc() Extract() 函数作用是提取日期&#xff0c;比如我们可以提取一个日期字段的年份&#xff0c;月份&#xff0c;日等数据 Trunc() 的作用则是截取&#xff0c;比如 2022-06-18 12:12:12&#xff0c;我们可以根据需求…

【LeetCode】617.合并二叉树

题目 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重叠…

【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeuS(DTU格式)数据集

【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeuS(DTU格式)数据集 提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeuS(DTU格式)数据集前言下载…

【Linux】【驱动】应用层和驱动层传输数据

【Linux】【驱动】应用层和驱动层传输数据 绪论1.如果我在应用层使用系统0 对设备节点进行打开&#xff0c;关闭&#xff0c;读写等操作会发生什么呢? 2 我们的应用层和内核层是不能直接进行数据传输的3 驱动部分的代码4 应用代码5 编译以及运行代码 绪论 Linux一切皆文件! 文…

解锁园区交通新模式:园区低速自动驾驶

在当今科技飞速发展的时代&#xff0c;自动驾驶技术成为了备受关注的领域之一。尤其是在园区内部交通管理方面&#xff0c;自动驾驶技术的应用正在日益受到重视。 园区低速自动驾驶的实现需要多个技术领域的协同合作&#xff0c;包括自动驾驶技术、计算机视觉技术、通信技术、物…