八股文之框架篇(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中的事务是如何实现的

本质是通过事务管理器 + 动态代理,对加了@Transaction注解的方法前后进行封装,事务拦截器来拦截方法调用,在执行方法之前开启事务,在执行目标方法后根据执行情况提交或回滚事务,受到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.mzph.cn/news/44510.shtml

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

相关文章

Python学习:迭代器与生成器的深入解析

函数在Python中扮演着重要角色&#xff0c;不仅可以封装代码逻辑&#xff0c;还能通过迭代器和生成器这两种强大的技术&#xff0c;实现更高效的数据处理和遍历。本篇博客将深入探讨Python函数的迭代器和生成器&#xff0c;结合实际案例为你揭示它们的神奇&#xff0c;以及如何…

线段树详解——影子宽度

OK&#xff0c;今天来讲一讲线段树~~ 线段树是什么线段树的实现线段树的时间复杂度线段树的应用线段树的节点结构其他操作和优化例题——影子宽度输入输出格式输入格式输出格式 输入输出样例输入样例输出样例 例题讲解 线段树是什么 线段树&#xff08; S e g m e n t Segmen…

C语言实例_解析GPS源数据

一、GPS数据格式介绍 GPS&#xff08;全球定位系统&#xff09;数据格式常见的是NMEA 0183格式&#xff0c;NMEA 0183格式是一种用于导航设备间传输数据的标准格式&#xff0c;定义了一套规范&#xff0c;使得不同厂商的设备可以通过串行通信接口&#xff08;常见的是RS-232&a…

Java 中操作 Redis

文章目录 一、Redis 常用数据类型二、Redis 常用操作命令1. 字符串命令2. 哈希命令3. 列表命令4. 集合命令5. 有序集合命令6. 通用命令 三、在 Java 中操作 Redis1. 导入 maven 坐标2. 配置 Redis 数据源3. 编写配置类 四、在代码中的具体使用 一、Redis 常用数据类型 Redis 存…

连号 区间数

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…

多IP服务器有什么作用

1.利于搜索引擎收录&#xff1a; 使用多IP应用云服务器可使一个IP对应一个网站&#xff0c;使各个网站之间的独立性更强&#xff0c;这样搜索引擎会评定该网站质量更高&#xff0c; 更容易抓取到该网站的页面&#xff0c;便于搜索引擎收录。 2.提高网站的权重和排名&#xff…

大文本的全文检索方案附件索引

一、简介 Elasticsearch附件索引是需要插件支持的功能&#xff0c;它允许将文件内容附加到Elasticsearch文档中&#xff0c;并对这些附件内容进行全文检索。本文将带你了解索引附件的原理和使用方法&#xff0c;并通过一个实际示例来说明如何在Elasticsearch中索引和检索文件附…

Android13 网络 Adb 默认开启

Android 13 网络 Adb 默认开启 文章目录 Android 13 网络 Adb 默认开启一、前言二、默认adb 代码实现1、修改的目录&#xff1a;2、具体修改&#xff1a;&#xff08;1&#xff09;在XXX_device.mk 添加属性&#xff08;2&#xff09;设置固定端口号&#xff08;3&#xff09;去…

SpringBoot---内置Tomcat 配置和切换

&#x1f600;前言 本篇博文是关于内置Tomcat 配置和切换&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x…

Spring Cloud Alibaba -微服务架构(二)

1. 微服务架构介绍 微服务架构&#xff0c; 简单的说就是将单体应用进一步拆分&#xff0c;拆分成更小的服务&#xff0c;每个服务都是一个可以独立运行的项目。 1.1 微服务架构的常见问题 一旦采用微服务系统架构&#xff0c;就势必会遇到这样几个问题&#xff1a; 这么多小…

测试基金相关的基本信息和常见概念

1、基金&#xff1a; 基金是由投资者共同出资形成的资金池&#xff0c;由专业机构管理和运作。基金公司将这些资金投资于不同的金融工具&#xff0c;如股票、债券、货币市场工具等&#xff0c;以实现共同的投资目标。 2、基金类型&#xff1a; 根据投资策略和资产类别&#…

深入浅出Pytorch函数——torch.nn.init.ones_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…

数据可视化数据调用浅析

数据可视化是现代数据分析和决策支持中不可或缺的一环。它将数据转化为图形、图表和可视化工具&#xff0c;以便更直观地理解和解释数据。在数据可视化的过程中&#xff0c;数据的调用和准备是关键的一步。本文将探讨数据可视化中的数据调用过程&#xff0c;并介绍一些常用的数…

(已解决)PySpark : AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘

AttributeError: ‘DataFrame’ object has no attribute ‘iteritems’ 原因在使用SparkSession对象中createDataFrame函数想要将pandas的dataframe转换成spark的dataframe时出现的 因为createDataFrame使用了新版本pandas弃用的iteritems()&#xff0c;所以报错 解决办法&…

city walk结合VR全景,打造新时代下的智慧城市

近期爆火的city walk是什么梗&#xff1f;它其实是近年来备受追捧的城市漫步方式&#xff0c;一种全新的城市探索方式&#xff0c;与传统的旅游观光不同&#xff0c;城市漫步更注重与城市的亲密接触&#xff0c;一步步地感受城市的脉动。其实也是一种自由、休闲的方式&#xff…

Vue的鼠标键盘事件

Vue的鼠标键盘事件 原生 鼠标事件(将v-on简写为) click // 点击 dblclick // 双击 mousedown // 按下 mousemove // 移动 mouseleave // 离开 mouseout // 移出 mouseenter // 进入 mouseover // 鼠标悬浮mousedown.left 键盘事件 keydown //键盘按下时触发 keypress …

Django实现音乐网站 ⑾

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是前端开发前的一些必要配置和首页展示开发。 目录 配置应用路由 创建应用路由文件 应用路径加入项目路径 创建项目模板 创建项目及应用模板路径 设置模板路径 设置静态资源路径 创建静态资源路径 配置静态…

thinkphp6前后端验证码分离以及验证

1.验证码接口生成验证码: public function verify(){return captcha(); } 也可以自己写方法 2.验证方法和普通模式session验证有区别,需要改原文件: 修改后的代码: <?php // +---------------------------------------------------------------------- // | ThinkP…

Git commit与pull的先后顺序

Git commit与pull的先后顺序_git先pull再commit_Mordor Java Girl的博客-CSDN博客 ​ 编辑yucoang2020.04.21 回复 28 先pull再commit的话, 你的commit也就不再纯粹了. 这一个commit不再是"你所编辑的xxx功能, 而是"别人所编辑的你所编辑的xxx". 我认为提交历…

Shell脚本基础( 四: sed编辑器)

目录 1 简介 1.1 sed编辑器的工作流程 2 sed 2.1 基本用法 2.2 sed基本格式 2.2.1 sed支持正则表达式 2.2.2 匹配正则表达式 2.2.3 奇数偶数表示 2.2.4 -d选项删除 2.2.5 -i修改文件内容 2.2.6 -a 追加 2.3 搜索替代 2.4 变量 1 简介 sed是一种流编辑器&#xff0c;…