5.SpringSpringBoot八股

Spring,Spring MVC,Spring Boot 之间什么关系?

Spring就是整个Spring框架的整体,包含AOP、JDBC、Spring MVC等等模块
SpringBoot是Spring的精简版,它在Spring的基础上添加了自动装配、内置tomcat服务器等功能,使得代码量更少,同时还添加了很多方便的注解,比如@Component等。
SpringMVC就是Spring框架专门用于web应用开发的模块,方便我们使用Model、View、Controller的三层架构。比如SpringBoot中的controller层、Service层、Mappler层,Entity层等等。

Spring相关

IOC、DI

ioc,控制反转,就是把创建对象实例的权力移交给了IOC容器来管理,创建好的实例都存储在单例池中

DI,依赖注入,就是把存在IOC容器中 的对象注入到该使用的地方去。

Bean的生命周期

1、BeanDefination的创建,在BeanFactory创建之后,把它放入BeanDefinitationMap中
2、根据BeanDefination,利用反射,实例化Bean对象
3、对实例化的Bean对象进行属性注入:
如果有setter方法,执行setter方法,
如果有Aware回调接口,则执行回调方法初始化对应的BeanName、BeanClassLoader、BeanFactory等
4、初始化
执行BeanPostProcessor中的PostProcessorBeforeInitialization方法
执行初始化方法
执行BeanPostProcessor中的PostProcessorAfterInitialization方法

5、放入单例池,使用

6、销毁
如果实现了DisableBean接口,执行Distory方法

非懒加载、懒加载、原型bean

默认非懒加载,最开始就存入IOC容器中
懒加载需要@Lazy,有需要才实例化。懒加载可以避免循环依赖问题
原型Bean就是非单例模式

BeanFactory和FactoryBean的区别?

前者是用来管理IOC容器的总接口
后者是用来实现自定义Bean的接口,如果要自定义bean,那就实现它,然后重写方法

BeanFactory和ApplicationContext的区别与联系?

后者是前者的子接口,因此,后者拥有前者的功能,即能够获取当前IOC容器中的实例对象
其次,后者还可以获取当前的环境变量等额外功能。

@Bean和FactoryBean的关系?

都可以创建实例到IOC容器中,
前者只创建一个Bean,有完整的生命周期
后者创建两个Bean,代理的Bean有完整的生命周期,被代理的原始对象只会存在于初始化

Spring支持哪些依赖注入的方式?

1、字段注入
2、Setter注入
3、构造器注入

为什么推荐构造器注入而不用字段注入?

1、掩盖了依赖注入的问题(虽然三级缓存能够解决这个问题),而构造器注入能够明确依赖之间的关系,从而避免依赖注入的发生。
2、字段注入不利于单元测试,需要mock一个对象才能执行。而构造注入很方便。

什么是Bean的循环依赖?如何解决循环依赖?

就是A引用B,B引用A。

对于字段注入,使用三级缓存解决

对于构造器、setter注入,使用懒加载解决。

三级缓存如何解决循环依赖?

解决循环依赖一定需要第三级缓存吗?

主要是为了防止AOP状态下的三级缓存

第三级缓存提供了一个lambda函数,用于判断当前是否为AOP类型的注入,如果是,则返回代理对象。
这样就避免了循环依赖的情况下,只能注入原初始化的对象,而无法注入代理对象。

解决循环依赖一定需要第二级缓存吗?

需要,假设A引用B\C,B->A, C->A,
A注入了B,此时要注入C,如果没有介于两者之间的,A就拿不到了。

什么场景下的循环依赖Spring无法解决?

构造器
原型Bean

@Lazy注解如何解决循环依赖?

其他时候都是代理对象加状态存在,因此解决了循环依赖问题。

将一个类声明为 Bean 的注解有哪些?

3种

@Autowired 和 @Resource 的区别是什么?(4个)

Bean 的作用域有哪些?如何配置呢?

scope:

  1. singleton
  2. prototype
  3. session
  4. request

Bean 是线程安全的吗?如何保证线程安全?

Spring AoP

1、介绍

面向切面编程

原理是基于动态代理+反射

2、使用,自定义打印日志的功能

1、先定义一个注解Interface
2、在使用的方法前面加上这个注解
3、写一个切面类,aspect

  1. 定义切点pointcut是注解。
  2. 定义环绕通知,around advice
  3. 环绕通知入参为连接点join point,他代表注解修饰的具体方法,在环绕通知前后写额外的方法即可

3、aop的两种实现方式?

4、多个切面的执行顺序如何控制?

5、AOP 的应用场景有哪些?

日志打印
事务
限流

6、AOP失效的情况?

  1. 内部调用
  2. 静态方法
  3. 私有方法

Spring MVC

介绍Spring MVC

3个部分

4个层次

执行流程

核心组件

1、handlerMapping
2、handlerAdapter
3、DispatchServlet
4、ViewResolver

过程

先传给DispatcherServlet。

1、handerMapping找controller
2、交给HandlerAdapter适配对应的Controller
3、Controller返回model和view
4、根据View解析视图,然后结合modle返回

SpringMVC的启动流程?

大概就是:
SpringBoot启动了,顺便在BeanFactory初始化的时候,tomcat也启动了,因此DispatcherServlet启动了,拦截就生效了。

统一异常处理怎么做?

ControllerAdvice + ExceptionHandler

Spring Data JPA

只需要知道,它和Mybatis一样都是ORM数据持久化的框架。

不过Mybatis比它更灵活,因此它用到不多。

Spring Security

登录流程
写SecurityConfig,继承自WebSecurityConfiguratorAdaptor

  1. 重写passwordEncoder
  2. config
  3. authenticManeger

实现UserDeailServiceImpl,getUserDetail,

验证用户名密码之后,根据id生成JWT,然后redis存入key为id,val为用户信息。

设置拦截器类OncePerRequestFilter,获取前端jwt,解析后到redis找,找到了之后,把用户信息整体存入线程本地变量。

1、JWT的作用

加密,实现前后端之间交互的身份认证

2、Redis的作用

保证单点登录有效,

每次拦截请求后都会刷新有效期,

只有当Redis的信息过期后,才会显示登录过期,需要重新登录

3、线程本地变量的作用

线程本地变量的生命周期依赖于Request,即只在本次请求中有效!

它的作用就是方便这次请求的时候,如果需要知道这个请求发起的用户的信息时,不再需要去redis或者再jwt解析了,而是直接从现场本地变量获取即可!!!

Spring中的设计模式

1、单例模式
Bean的IOC池,

2、工厂模式
Collection类

3、适配器模式
HandlerAdapter

类1
接口
接口的实现

  • 构造器获得类1的实例
  • 执行更多

4、装饰器模式

接口
实现1
实现2

  • 构造器获得实现1的实例
  • 执行更多

5、观察者模式
被观察的接口a(两个抽象方法,注册、唤醒)
观察者接口b(一个方法执行)

接口a的唯一实现aa(一个list,重写两个方法)
接口b的多个实现b1、b2。。。(只需要重写一个方法即可)

Spring事务

事务的特性:

ACID
原子性
持久性
隔离性
一致性

Spring如何支持事务

1、前提,数据库支持事务

2、两种方式

  1. 显式地使用TractionalTemplate接口实现
  2. 使用@Transactional注解,

事务的传播行为

3种
Reqired,如果有,则直接加入当前事务
Requires new,无论有没有,都新增事务
Nested,如果有,则新增一个存档点,而不是直接新增事务。

举例说明:
1.
2.
3.

事务隔离级别

读未提交
读已提交
可重复读
可串行化

脏读,就是更新过程中可以读,

不可重复度,就是重复读一个正在修改的数据,前后读到的内容不一样

幻读,就是重复读一个count,前后不一样

@transactional的原理

Spring自身不实现隔离,只是提供了回滚和提交的标记。

真正的隔离级别的实现取决于数据库。这也是为什么如果数据库是MYISAM,Spring的事务就失效了。

@Transactional的原理是通过aop+动态代理,在动态代理的方法前后添加事务提交和回滚的标记。

事务失效的情况

。。。

@Async注解为什么不建议使用?

SpringBoot

SpringBoot的主要优点有哪些?即和Spring的区别?

1、自动装配
2、自带web应用
3、内置cli

什么是 Spring Boot Starters?

1、Spring官方或者热门的第三方组件一般都会维护一个Starters。
官方的是 Spring-boot-xxx-starters、第三方的是xxx-Spring-boot-starters

2、引入xml后,不需要担心版本问题和依赖问题

3、支持自动装配

Spring Boot 支持哪些内嵌 Servlet 容器?

tomcat、jetty、undertow

默认tomcat,如果要用别的,只需要更改xml即可

介绍一下@SpringBootApplication 注解

1、EnableAutoConfirguation
2、Confirguation
3、ComponentScan

SpringBoot的启动流程

1、初始化SpringApplication

  1. 确定要用哪个web服务
  2. 创建初始化器、监听器

2、执行SpringApplication的run方法

  1. 启动监听器
  2. 加载环境变量配置信息
  3. 创建Spring容器
  4. 启动容器前的操作
  5. 启动容器(启动SpringFactory、自动装配,启动Web应用)
  6. 发布就绪

Spring Boot 的自动配置是如何实现的?

1、什么是自动装配
就是在应用依赖第三方组件的时候,只需要导入依赖即可,不需要再写繁琐的xml、Bean文件了

2、如何实现的自动装配?
通过EnableAutoConfirguation实现

在第三方组件的依赖导入时,通过starter约定了所有需要导入的内容都有一个配置类,然后把需要导入的用Bean修饰

SpringFactoryLoader,约定去每个第三方组件的jar包的META-INF的spirng。factiories中有全类名。然后根据全类名进行加载

加载的过程中是通过import selector配合被加载的Bean前面的条件注解是否被满足来判断是否需要加载,比如它有一个ConditionalOnclass(。。。)那么就需要提前有这个类才会加载。

SpringBoot中如何自定义Starter?

1、父
2、xxx-springboot-starter,空项目
3、xxx-springboot-starter-autoconfigurer

  1. confirgurationProporties
  2. service
  3. @Config+@Bean、@enableConfirgurationProporties、@ConditionalOnClass
  4. META-INF。。。

4、install
5、xml导入即可使用了

开发 RESTful Web 服务常用的注解有哪些?

1、Bean相关
2、http相关
3、前后端传值
4、读取配置

Spring Boot 常用的读取配置文件的方法有哪些?

背两个
@Values
@ConfirgurationProporties

Spring Boot 加载配置文件的优先级了解么?

1、
2、
3、
1.
2.
3.

什么是Bean 映射工具?常用的 Bean 映射工具有哪些?

Spring Boot 如何监控系统实际运行状况?

Spring Boot 如何做请求参数校验?

1、实体类上加
2、参数前面加

Spring Boot 中如何实现定时任务 ?

启动任务接口
启动类注解
方法注解

@RestController

MyBatis

使用MyBatis

1、写实体类
2、写mapper接口继承自BaseMapper
3、写serviceImpl继承自ServiceImpl

新增Mapper接口的方法
新增mapper。xml写具体的sql

SQL注入? #{} ${}

什么是DAO层?

Mapper接口中只能有一个有参方法和一个无参方法

MyBatis 是如何进行分页的?分页插件的原理是什么?

默认:逻辑分页

可以自定义实现物理分页

也可以使用第三方组件实现物理分页(PageHelper)

Mybatis如何编写一个插件?

原理:AOP,动态代理

实现:

  1. @Intercepts
  2. 实现Interceptor接口,
  3. 写intercept方法,具体的sql语句

动态sql

if
where
choose
foreach

原理:动态代理

Mybatis只有接口没有实现类,为什么能调用去操作数据库?

  1. 写了mapper
  2. 动态代理接口,生成对应的方法

Mybatis和Mybatis-plus的区别?

Mybatis和Hibernate

ORM
半自动映射

MyBatis中有哪几种字段映射的方式

resultType和resultMap

说说Mybatis中查询SQL的执行流程

1、创建sqlSessionFactory
2、开启一个OpenSession
3、关联到Mapper动态代理生成的实现类
4、执行类的方法,执行sql

说说MyBatis中的数据库连接池

说说MyBatis中的延迟加载

Netty

基于NIO的网络通信框架

比如RocketMQ的网络传输就是用Netty实现的。

原理

selector单个,对应一个线程

channel多个

client对应每个channel

什么是 TCP 粘包/拆包?有什么解决办法呢?

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

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

相关文章

Finetuning vs. Prompting:大语言模型两种使用方式

目录 前言1. 对于大型语言模型的两种不同期待2. Finetune(专才)3. Prompt(通才)3.1 In-context Learning3.2 Instruction-tuning3.3 Chain of Thought(COT) Prompting3.4 用机器来找Prompt 总结参考 前言 这里和大家分享下关于大语言模型的两种使用方式,一种是 Fine…

2024最新 PyCharm 2024.1 更新要点汇总

2024最新 PyCharm 2024.1 更新要点汇总 文章目录 2024最新 PyCharm 2024.1 更新要点汇总摘要引言 Hugging Face:模型和数据集的快速文档预览针对 JavaScript 和 TypeScript 的全行代码补全 PyCharm Professional编辑器中的粘性行编辑器内代码审查新终端 Beta新的 AI…

ip连接检测

1.在C#中,你可以使用Socket类来检测IP连接是否正常。以下是一个简单的示例代码,演示了如何使用Socket类来检测IP连接的可用性: using System; using System.Net; using System.Net.Sockets;class Program {static void Main(string[] args){…

js+网络摄像头实现人体肢体关键点动作捕获

最近有一个项目,客户需要用户人体姿势识别,进行表演考核用途,或者康复中心用户恢复护理考核,需要用摄像头进行人体四肢进行肢体关键点对比考核,资料还是太少了。只有个别大佬发了部分技术指导。感觉写的不错。 阿里云…

【微信小程序——案例——本地生活(列表页面)】

案例——本地生活(列表页面) 九宫格中实现导航跳转——以汽车服务为案例(之后可以全部实现页面跳转——现在先实现一个) 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图: 动态设置标题内容—…

PTA(题目集三 题目 代码 C++ 注解)

目录 题目一: 代码: 题目二: 代码: 题目三: 代码: 题目四: 代码: 题目五: 代码: 题目六: 代码: 题目七: 代码…

【QT+QGIS跨平台编译】161:【qgispython跨平台编译】—【qgis_python.h生成】

点击查看专栏目录 文章目录 一、qgis_python.h介绍二、信息分析三、qgis_python.h生成一、qgis_python.h介绍 qgis_python.h 是 QGIS(Quantum Geographic Information System)GIS 软件的一个头文件。QGIS 是一个开源的地理信息系统软件,提供了丰富的地图制图和空间分析功能。…

第四百五十九回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容,本章回中将介绍如何获取时间戳.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Arduino IDE开发esp8266,如何调试

在Arduino IDE中开发ESP8266时,调试通常需要依赖于串行输出(Serial.print 语句)和LED指示灯。由于ESP8266没有像一些高级开发平台那样的内置调试功能(例如JTAG或SWD接口),所以调试可能较为基础。以下是一些用于Arduino IDE中ESP8266开发调试的基本步骤: 环境准备:首先,…

一款绿联VGA转HDMI转换器MS9288A方案

实物 该转换器在后备箱放了一段时间,就成这个样子了,当然,后备箱也比较恶劣,堪比盐雾试验,因为有瓶稀盐酸倒了,发现不及时,一个新的转换器就成这个样子了。 VGA转HDMI转换器VGA输入插头 VGA转…

Go语言中常见的JSON处理错误

1. 由嵌入式字段导致的非预期行为 在下面的例子中,我们创建一个Event结构体,其包含一个ID和一个嵌入式的时间戳: type Event struct {ID inttime.Time } 由于 time.Time 是嵌入式的,因此我们可以直接通过Event来访问 time.Time 方法,比如event.Second( )。 嵌入式字段…

【Leetcode|#88.合并两个有序数组】

题目 给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数 m 和 n ,分别表示nums1和nums2中的元素数目。 请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。 注意:最终,合并后数组不应由函数返…

嵌入式MCU BootLoader开发配置详细笔记教程

目录 一、BootLoader基础 二、BootLoader原理及配置 三、BootLoader程序 bootloader.h bootloader.c 四、Application1 用户程序 application1.h application1.c 五、Application2 用户程序 application2.h 六、程序运行效果 七、工程文件Demo 一、BootLoader基础 …

HTTP Keep-Alive的作用

作用:Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时, Keep-Alive功能避免了建立或者重新建立连接。Web服务器,基本上都支持HTTP Keep- Alive。 缺点:对于提供静态内容的网站来…

Unity 中消息提醒框

Tooltip 用于ui布局 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI;[ExecuteInEditMode()] // 可以在编辑模式下运行public class Tooltip : MonoBehaviour {public TMP_Text header; // 头部文本publi…

MCU最小系统的电源模块设计和复位模块的设计

最小操作系统就是一个电路,这个电路里面必须要的东西(如人需要喝水吃饭温度等情况,才能或者) 现在我们要解决这三个问题 这里V开头的,都是电源管脚 这里解释一下: 这里要注意哪些是电路电压,哪…

简历上写熟悉Linux下常用命令?直接寄

大家写简历技术栈时,都觉得越多越好,其中一条,熟悉Linux下常用命令?其实开发中Linux不是必备考点,除了运维,真正用的多的仅仅cd ls mkdir等,但当面试官问到上面命令时,是不是就傻眼了…

Android14音频进阶之Perfetto高级调试技巧(六十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

【网安小白成长之路】6.pikachu、sql-labs、upload-labs靶场搭建

🐮博主syst1m 带你 acquire knowledge! ✨博客首页——syst1m的博客💘 🔞 《网安小白成长之路(我要变成大佬😎!!)》真实小白学习历程,手把手带你一起从入门到入狱🚭 &…

oracle 19c 主备 补丁升级19.22

补丁升级流程 备库升级 备库备份$ORALCE_HOME du -sh $ORACLE_HOME ​​​​​​​ 备份目录将dbhome_1压缩 cd $ORACLE_HOME cd .. Ls tar -cvzf db_home.tar.gz db_home_1 /opt/oracle/product/19c ​​​​​​​​​​​​​​ 关闭监听关闭数据库查看sq…