八股文之框架篇(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.rhkb.cn/news/93586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Apollo】Apollo 8.0系统下载指南

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

全面揭秘:抖音集团 QUIC 千万 QPS 应用实践

近日&#xff0c;ArchSummit全球架构师峰会深圳站成功举办。随着移动互联网的蓬勃发展&#xff0c;人们对网络速度和实时性的需求日益增加。在面对越来越多的图片、视频和音频等大资源时&#xff0c;页面加载缓慢、视频卡顿等问题频发&#xff0c;传统的传输控制协议&#xff0…

Nginx代理功能与负载均衡详解

序言 Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;关于nginx的基本语法常识与配置已在上篇文章中有说明&#xff0c;这篇就开门见山&#xff0c;先描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。 Nginx代理服务的配置说明 1、上一篇中我们在http…

如何使用Python获取SAP Temporary key 临时密钥

什么是Sap 临时密钥&#xff1f; SAP 临时密钥是用于激活 SAP 软件的一种许可证&#xff0c;只能在有限的时间内使用。这些密钥可用于评估目的或在系统迁移期间使用。它们是临时解决方案&#xff0c;通常在一定时间后过期。 如何获取Sap Temporary keys? 临时密钥: 如果创建…

2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码)

2011-2021年数字普惠金融指数Bartik工具变量法&#xff08;含原始数据和Bartik工具变量法代码&#xff09; 1、时间&#xff1a;2011-2020&#xff08;省级、城市&#xff09;&#xff0c;2014-2020&#xff08;区县&#xff09; 2、原始数据来源&#xff1a;北大金融研究中心…

【数据结构与算法——TypeScript】树结构Tree

【数据结构与算法——TypeScript】 树结构(Tree) 认识树结构以及特性 什么是树? &#x1f332; 真实的树&#xff1a;相信每个人对现实生活中的树都会非常熟悉 &#x1f332; 我们来看一下树有什么特点&#xff1f; ▫️ 树通常有一个根。连接着根的是树干。 ▫️ 树干到…

mysql 8.0安装

操作系统&#xff1a;22.04.1-Ubuntu apt 安装命令 sudo apt install mysql-client-core-8.0 sudo apt install mysql-server-8.0终端输入 mysql 可以直接免密登录 如果此时提示需要密码&#xff0c;则可以进入配置文件&#xff0c;设置免密登录 sudo vim /etc/mysql/mysq…

探究主成分分析方法数学原理

目录 1、简介 2、实现原理 3、实现步骤 4、公式分析 5、实例分析 6、⭐协方差矩阵补充说明 7、LaTex文本 ⭐创作不易&#xff0c;您的一键三连&#xff0c;就是支持我写作的最大动力&#xff01;&#x1f979; 关于代码如何实现&#xff0c;请看这篇文章&#xff1a;[机器…

Android 远程真机调研

背景 现有的安卓测试机器较少&#xff0c;很难满足 SDK 的兼容性测试及线上问题&#xff08;特殊机型&#xff09;验证&#xff0c;基于真机成本较高且数量较多的前提下&#xff0c;可以考虑使用云测平台上的机器进行验证&#xff0c;因此需要针对各云测平台进行调研、比较。 …

打造专属照片分享平台:快速上手Piwigo网页搭建

文章目录 通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo 总结 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x…

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

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

最好的开放式耳机品牌,开放式耳机选购推荐

传统入耳式耳机长时间佩戴会给耳朵增加压力&#xff0c;在封闭状态下&#xff0c;还容易滋生细菌&#xff0c;引发耳部感染、发炎的症状&#xff0c;但开放式耳机就没有这种情况发生&#xff0c;无需入耳设计&#xff0c;佩戴更舒适&#xff0c;音质更真实通透&#xff0c;也不…

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…

【Leetcode】84.柱状图中最大的矩形(Hard)

一、题目 1、题目描述 给定 n n n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10示例2:…

Java开源项目mall学习笔记(1)——项目初始化

一、学习声明与项目介绍 该笔记是记录学习开源项目mall过程的文档笔记&#xff0c;完全原创&#xff0c;转载请声明。同时也对开源项目的作者表示感谢&#xff01; mall: &#x1f525; mall项目是一套基于 SpringBoot Vue uni-app 实现的电商系统&#xff0c;包括前台商城项…

【Kafka】2.在SpringBoot中使用官方原生java版Kafka客户端

目 录 1. 新建一个消息生产者2. 新建一个消息消费者3. 测 试 在开始之前&#xff0c;需要先做点准备工作&#xff0c;用 IDEA 新建一个 Maven 项目&#xff0c;取名 kafka-study&#xff0c;然后删掉它的 src 目录&#xff0c;接着在 pom.xml 里面引入下面的依赖。这个项目的作…

NanoPi NEO移植LVGL8.3.5到1.69寸ST7789V屏幕

移植前准备 移植好fbtft屏幕驱动 参考链接&#xff1a;友善之臂NanoPi NEO利用fbtft驱动点亮1.69寸ST7789V2屏幕 获取源码 名称地址描述lvglhttps://github.com/lvgl/lvgl.gitlvgl-8.3.5lv_drivershttps://github.com/lvgl/lv_drivers.gitlv_drivers-6.1.1 创建工程目录 创…

时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 1.Matlab实现GRU门控循环单元时间序列预测未…

计算机竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

AUTOSAR NvM协议栈集成方法

一、涉及的模块 Bsw&#xff1a;NvM、MemIf、Fee、Crc Mcal&#xff1a;Fls 其中一些芯片厂商的MCAL也会提供Fee模块&#xff0c;本文选择使用ETAS提供的Fee模块&#xff0c;好处是Fee的Block不需要手动配&#xff0c;在NvM中配好了Block之后&#xff0c;生成Bsw代码的同时会…