【框架】Spring 框架重点解析

Spring 框架重点解析

1. Spring 框架中的单例 bean 是线程安全的吗?

在这里插入图片描述

不是线程安全的

  • Spring 框架中有一个 @Scope 注解,默认的值是 singleton,即单例的;
  • 因为一般在 Spring 的 bean 对象都是无状态的(在生命周期中不被修改的,比如正经开发下, service 层的和 dao 层的),没有线程安全问题;
  • 如果在 bean 中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例 prototype 或者加锁来解决;

2. 什么是 AOP,你们项目中有没有使用到 AOP 呢?

在这里插入图片描述

什么是 AOP ?

  • 面向切面编程,用户将与业务无直接相关,但却对多个对象产生影响的公共行为和逻辑,将这些抽取成公共模块进行复用,降低耦合度;
  • 可以理解为 一组业务的效果上的"增强buff"

原理就是动态代理

  • 即目标方法的执行时机和结果可以由代理决定和处理;

你们项目有没有使用到 AOP ?

  • 统一处理(拦截器、异常处理器、响应处理器),记录接口访问日志,缓存处理,Spring 实现的事务
  • 记录接口访问日志核心就是,使用 Spring AOP 中的环绕通知 + 切点表达式(找到记录日志的方法),通过环绕通知的参数获取请求方法的参数,获得这些参数后,进行一些业务;

joinPoint.proceed();

代表,切入点执行,也就是目标方法的执行;

3. Spring 中的事务是如何实现的?

对于编程式事务,事务的维护还是有目标方法的业务进行,没用到 AOP,对业务代码入侵性大,项目中很少使用;

而对于声明式事务,通过对方法加注解 @Transactional 声明该方法是一个事务

  • 其本质是通过 AOP 功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后进行提交或者捕获到异常进行回滚事务;

在这里插入图片描述

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

  1. 异常捕获处理,自己业务中处理了异常,没有抛出,这就意味着这个业务被 Spring 认为是“没有问题,无需回滚”
    • 解决:根据实际业务决定是否要手动抛出、手动回滚;
  2. 抛出检查异常(throws),Spring 默认认为事务抛出的检查异常要被调用者处理,故没有回滚;
    • 解决:设置注解 @Transactional 的 rollbackFor 属性为 Exception.class,则即使是检查异常,也会回滚;
  3. 非 public 方法导致的事务失效,由于 Spring 声明式事务的原理是 Spring AOP,所以创建代理、获取参数、添加事务通知,都要求方法是 public;
    • 解决:改为 public;

5. Spring 中 Bean 的生命周期(如何去管理和创建 Bean 实例的?)

在这里插入图片描述

推荐文章:【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)_bean的全局变量-CSDN博客

  1. 通过 BeanDefinition 获取 Bean 的定义信息,调用构造方法创建 Bean(空);

    在这里插入图片描述

  2. Bean 对象中成员变量的依赖注入;

  3. 处理 Aware 接口(Bean Name Aware、Bean Factory Aware、ApplicationContextAware);

  4. Bean 处理器 BeanPostProcessor - 前置;

  5. 初始化方法(InitializingBean、init-method);

  6. Bean 处理器 BeanPostProcessor - 后置;

    • 可以去加强 Bean 对象,例如使其成为代理对象,可以被动态代理;

    在这里插入图片描述

  7. 销毁 Bean;

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

6.1 循环依赖是什么?

在这里插入图片描述

6.2 Spring 的三种缓存

在这里插入图片描述

6.3 一级缓存 + 二级缓存解决普通 Bean 对象的循环依赖

显然,循环依赖的主要原因就是两个对象都是半成品,所以单凭一级缓存是无法解决循环依赖问题的;

在这里插入图片描述

6.4 三种缓存一起解决加强 Bean 对象的循环依赖

由于原始对象是没有被特殊处理的,所以只凭借一二级缓存无法注入一些加强对象,如代理对象;

  • 因为在 6.3 中,将半成品注入给 B,是因为地址后面不会变化,这样即使注入了半成品,也不会影响结果;
  • 而代理对象地址和性质跟原对象是不同的;

这个时候可以加上三级缓存来解决问题;

在这里插入图片描述

6.5 构造方法出现了循环依赖

由于 Bean 的生命周期中构造函数是第一个执行的,Spring 框架并不能解决构造器函数的依赖注入,而我们可以通过“延迟加载”来解决问题;

在这里插入图片描述

6.6 回答

  • 循环依赖:循环依赖也就是循环引用,也就是一个或一个以上的 Bean 互相注入的现象,形成了闭环。如 A 依赖 B,B 依赖 A;
  • 循环依赖在 Spring 中是允许存在的,Spring 框架依据三级缓存已经解决了大部分的循环依赖;
    1. 一级缓存:单例池,存放完整的 Bean 对象;
    2. 二级缓存:缓存 Bean 半成品对象;
    3. 三级缓存:缓存的是 ObjectFactory,表示对象工厂,用来创建某个 Bean(间接存储 Bean 对象);
  • 当然,Spring 无法解决构造方法出现了循环依赖的问题,但是我们可以通过 @Lazy 注解让某个 Bean “延迟加载”来解决问题;

7. Spring MVC 的执行流程知道吗?

7.1 JSP

在这里插入图片描述

7.2 前后端分离

在这里插入图片描述

AOP 也大概在 3、4、5 起代理作用,感兴趣可以去研究,不作为重点;

7.3 回答

Spring MVC 的执行流程是这个框架最核心的内容了,有两种:

  1. 比较老旧的 JSP;
  2. 比较主流的前后端分离的异步、接口开发;

对于 JSP :

  1. 用户发送请求到 前端控制器 DispatcherServlet;
  2. 前端控制器 DispatcherServlet 收到请求调用 处理器映射器 HandlerMapping;
  3. 处理器映射器 HandlerMapping 将 url 映射到对应的处理器,生成 处理器执行链 HandlerExecutionChain 返回给 前端控制器 DispatcherServlet;
  4. 前端控制器 DispatcherServlet 调用 处理器适配器 HandlerAdapter;
  5. 处理器适配器 HandlerAdapter 经过适配调用具体的处理器(Handler/Controller),进行目标方法的参数处理以及返回值处理,并将结果转化为逻辑视图数据 ModelAndView 返回给 前端控制器 DispatcherServlet;
  6. 前端控制器 DispatcherServlet 将 ModelAndView 传给 视图解析器 ViewReslover;
  7. 视图解析器 ViewReslover 将 ModelAndView 解析成真实的视图数据 View 返回给 前端控制器 DispatcherServlet;
  8. 前端控制器 DispatcherServlet 根据 View 进行渲染视图;
  9. 前端控制器 DispatcherServlet 将页面响应给用户;

对于前后端分离:

  1. 用户发送请求到 前端控制器 DispatcherServlet;
  2. 前端控制器 DispatcherServlet 收到请求调用 处理器映射器 HandlerMapping;
  3. 处理器映射器 HandlerMapping 将 url 映射到对应的处理器,生成 处理器执行链 HandlerExecutionChain 返回给 前端控制器 DispatcherServlet;
  4. 前端控制器 DispatcherServlet 调用 处理器适配器 HandlerAdapter;
  5. 处理器适配器 HandlerAdapter 经过适配调用具体的处理器(Handler/Controller),进行目标方法的参数处理以及返回值处理,将数据直接响应给用户;
  6. 方法上如果添加了 @ResponseBody处理器适配器 HandlerAdapter 将目标方法的返回值转化为 JSON 字符串再响应给用户;

8. Spring Boot 自动配置原理

我们知道,Spring 中有不少的 Bean 是自带的和程序员自己写的,那么我们通过启动类,是怎么让这些 Bean 自动配置的呢?

就需要理解一下 Spring Boot 自动配置原理

8.1 @SpringBootApplication 注解

  1. @SpringBootConfiguration:声明一个配置类;
  2. @ComponentScan:组件扫描,扫描的包路径下的 Bean 存到 Spring 容器中;
  3. @EnableAutoConfiguration:Spring Boot 实现自动化配置的核心注解;

在这里插入图片描述

8.2 @EnableAutoConfiguration 注解

  1. @Import 注解导入了配置选择器,读取该项目的以及引用的 jar 包的包路径下的 META-INF/spring.factories 文件中的所有配置类;
  2. 根据一些条件判断的注解去判断是否把配置类中的 Bean 放入 Spring 容器;

在这里插入图片描述

在这里插入图片描述

8.3 回答

在这里插入图片描述

  1. 在 Spring Boot 项目中的引导类有一个注解 @SpringBootApplication,这个注解其实是对三个注解进行了封装,分别是:
    1. @SpringBootConfiguration:声明一个配置类;
    2. @ComponentScan:组件扫描,扫描的包路径下的 Bean 存到 Spring 容器中;
    3. @EnableAutoConfiguration:Spring Boot 实现自动化配置的核心注解;
  2. 其中,核心注解 @EnableAutoConfiguration,通过 @Import 注解导入了配置选择器,读取该项目的以及引用的 jar 包的包路径下的 META-INF/spring.factories 文件中的所有配置类;
  3. 会有一些条件判断的注解(@Conditional 开头),例如:
    1. @ConditionalOnClass 判断是否有对应的字节码文件,如果有字节码,就加载该类把这个配置类所有的 Bean 放入 Spring 容器中;
    2. @ConditionalOnMissingBean 加在 @Bean 标注的方法上,判断是否有对应的 Bean,如果对应的 Bean 不存在,则将这个 Bean 放入 Spring 容器;

9. Spring、Spring Boot、Spring MVC 常见注解有哪些?

9.1 Spring 的常见注解有哪些?

在这里插入图片描述

9.2 Spring MVC 的常见注解有哪些?

在这里插入图片描述

9.3 Spring Boot 的常见注解有哪些?

在这里插入图片描述

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

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

相关文章

解决Mybatis报Type interface *.*Mapper is not known to the MapperRegis

解决Mybatis报Type interface *.*Mapper is not known to the MapperRegis 问题发现问题解决方法一:检查Mapper文件的namespace路径是否正确方法二:使用其他方法是否正确 问题发现 在学习MyBatis框架的时候,不使用 XML 构建 SqlSessionFacto…

Project_Euler-44 题解

Project_Euler-44 题解 题目 思路 题目给出了一个性质,让我在对应性质的数据中找出目标值,这种问题首先想到的就是枚举。 我们可以枚举 P k P_k Pk​ ,对于每一个 P k P_k Pk​ ,我们再枚举 P j P_j Pj​, P j P_…

【ue5】滑铲系统蓝图笔记

大致逻辑如下: 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色,便于区分。 二、调整动画 1.启动根运动 启动根运动后,人物才可以位移,不然只能在原地。 打开动画序列,勾选启用根运动Enabled…

用node或者vscode开启一个简单的本地server服务器,加载html网页

使用Live Server 想要加载本地html页面可以快速能让它在你本地浏览器中打开,可以有好多种方式,如果你有使用vscode,可以安装一个插件:Live Server,然后直接在vscode中直接右键就可以开启这个服务: 安装好之…

C++基于多设计模式下的同步异步日志系统day2

📟作者主页:慢热的陕西人 🌴专栏链接:C基于多设计模式下的同步&异步日志系统 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要内容实现了日志代码设计的实…

select,poll和epoll有什么区别

它们都是NIO中多路复用的三种实现机制,是由linux操作系统提供的。 用户空间和内核空间:操作系统为了保证系统安全,将内核分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备&#xff0…

IT廉连看——Uniapp——配置文件pages

IT廉连看——Uniapp——配置文件pages [IT廉连看] 本堂课主要为大家介绍pages.json这个配置文件 一、打开官网查看pages.json可以配置哪些属性。 下面边写边讲解 新建一个home页面理解一下这句话。 以下一些页面的通用配置 通用设置里我们可以对导航栏和状态栏进行一些设…

Android修行手册-集成Python开发环境

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

Python爬虫——Urllib库-2

编解码 问题引入 例如: https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串乱码就是章若楠 如果这里是写的章若楠就会 产生这样的错误 所以我们就可以使用get请求方式的quote方法了 get请求方式的q…

laravel ApiResponse接口统一响应封装

一&#xff0c;新增接口返回码配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

使用el-form之表单校验自动定位到报错位置问题,,提升用户体验

需求描述 由于需要填写的表单项太多&#xff0c;提交的时候校验不通过&#xff0c; 如果没填写的表单项在最上面&#xff0c;用户看不到不知道发生了啥&#xff0c; 所以需要将页面滚动定位到第一个报错的表单项位置&#xff0c;提升用户体验实现步骤 1. 给form表单添加ref …

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…

1209. 带分数 刷题笔记

思路 暴力匹配 读入目标数 n 看n是否与ab/c相等 因为c里面的除法是整除 我们将 nab/c 转换为 c*na*cb 那么如何获得a,b&#xff0c;c 依题意 a&#xff0c;b&#xff0c;c三个数由1-9九个数字组成 且每个数字只能出现一次 由此 我们可以搜出123456789的全部排列方式…

我做的app上架应用市场一天,快破400下载量,0差评

上集说到&#xff0c;我做了一个叫QB音乐的安卓app&#xff0c;经过一段时间的自我使用与测试终于算发布了。我昨天顺便把它上架了奇妙应用市场&#xff0c;截止目前3月1号过去了一天&#xff0c;下载量快到400&#xff0c;0差评。看来还是能正常使用的。 一、为什么做这个ap…

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

深入剖析k8s-Pod篇

为什么需要Pod&#xff1f; 进程是以进程组的方式组织在一起。受限制容器的“单进程模型”&#xff0c; 成组调用没有被妥善处理&#xff08;资源调用有限&#xff09;&#xff0c;使用资源囤积则导致复杂度上升。 在k8s项目中&#xff0c;Pod的实现需要使用一个中间容器——…

css【详解】—— 圣杯布局 vs 双飞翼布局 (含手写清除浮动 clearfix)

两者功能效果相同&#xff0c;实现方式不同 效果预览 两侧宽度固定&#xff0c;中间宽度自适应&#xff08;三栏布局&#xff09;中间部分优先渲染允许三列中的任意一列成为最高列 圣杯布局 通过左右栏填充容器的左右 padding 实现&#xff0c;更多细节详见注释。 <!DOCTYP…

《无线网络技术》考试版笔记

第一章 无线网络介绍 什么是多径效应&#xff0c;如何去克服&#xff1a; 在发射机和接收机之间没有明显的直线路径时&#xff0c;就会产生多径传播。如果两个信号彼此叠加&#xff0c;那么接收设备就无法正确解调信号&#xff0c;无法还原为它的原始数据形式。 可以稍微调整接…

USLE模型-LS因子的计算

目录 计算坡度计算填洼计算流向计算水流长度计算水平投影![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/75e015b2d6874ce9b6652f2b8730b90f.png)计算可变的坡度指数m计算坡长因子L计算坡度因子S计算LS因子参考视频 计算坡度 准备好30米分辨率的dem 计算填洼 计…