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:
- singleton
- prototype
- session
- request
Bean 是线程安全的吗?如何保证线程安全?
Spring AoP
1、介绍
面向切面编程
原理是基于动态代理+反射
2、使用,自定义打印日志的功能
1、先定义一个注解Interface
2、在使用的方法前面加上这个注解
3、写一个切面类,aspect
- 定义切点pointcut是注解。
- 定义环绕通知,around advice
- 环绕通知入参为连接点join point,他代表注解修饰的具体方法,在环绕通知前后写额外的方法即可
3、aop的两种实现方式?
4、多个切面的执行顺序如何控制?
5、AOP 的应用场景有哪些?
日志打印
事务
限流
6、AOP失效的情况?
- 内部调用
- 静态方法
- 私有方法
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
- 重写passwordEncoder
- config
- 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、两种方式
- 显式地使用TractionalTemplate接口实现
- 使用@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
- 确定要用哪个web服务
- 创建初始化器、监听器
2、执行SpringApplication的run方法
- 启动监听器
- 加载环境变量配置信息
- 创建Spring容器
- 启动容器前的操作
- 启动容器(启动SpringFactory、自动装配,启动Web应用)
- 发布就绪
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
- confirgurationProporties
- service
- @Config+@Bean、@enableConfirgurationProporties、@ConditionalOnClass
- 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,动态代理
实现:
- @Intercepts
- 实现Interceptor接口,
- 写intercept方法,具体的sql语句
动态sql
if
where
choose
foreach
原理:动态代理
Mybatis只有接口没有实现类,为什么能调用去操作数据库?
- 写了mapper
- 动态代理接口,生成对应的方法
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 粘包/拆包?有什么解决办法呢?
相关文章:
5.SpringSpringBoot八股
Spring,Spring MVC,Spring Boot 之间什么关系? Spring就是整个Spring框架的整体,包含AOP、JDBC、Spring MVC等等模块 SpringBoot是Spring的精简版,它在Spring的基础上添加了自动装配、内置tomcat服务器等功能,使得代码量更少,同…...
0基础刷图论最短路 3(从ATcoder 0分到1800分)
AT最短路刷题3(本文难度rated 1200~ 1400) 题目来源:Atcoder 题目收集: https://atcoder-tags.herokuapp.com/tags/Graph/Shortest-Path (里面按tag分类好了Atcoder的所有题目,类似cf) &#x…...
k8s+docker一键安装过程
环境: k8s 1.20 docker 20.10 centos7.9 #docker安装 yum install -y epel-release yum install -y yum-utils yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce-20.10.6 docker-ce-cli-2…...
Python3+Appium+Android SDK+真机+实现app自动化测试-基于Red Hat7.9版本搭建环境及运行python脚本。
1、总体概述? 收费有收费的服务,那就是细致。Red Hat9.0自动化环境也有,需要的说一声。 1、实现在Red Ha/t Enterprise Linux7.9环境中搭建部署app自动化测试环境,提供详细步骤。 2、版本说明:jdk8/17+nodejs16/18/19/20/21+android sdk29+python3.9.18/3.11.1+appium1…...

深入理解MD5算法:原理、应用与安全
title: 深入理解MD5算法:原理、应用与安全 date: 2024/4/11 20:55:57 updated: 2024/4/11 20:55:57 tags: MD5算法数据安全哈希函数摘要算法安全漏洞SHA算法密码学 第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要。消息…...
架构师系列-搜索引擎ElasticSearch(三)- Java API
SpringBoot整合ES 搭建SpringBoot工程,引入ElasticSearch相关坐标 <!--引入es的坐标--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><versi…...

Ubuntu下配置Android NDK环境
Android-NDK的下载 下载Android-NDK wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin 执行bin文件(即解压) ./android-ndk-r10c-linux-x86_64.bin Android-NDK的配置 要想使用Android-NDK,还需要进行环境变量…...

使用 vue3-sfc-loader 加载远程Vue文件, 在运行时动态加载 .vue 文件。无需 Node.js 环境,无需 (webpack) 构建步骤
加载远程Vue文件 vue3-sfc-loader vue3-sfc-loader ,它是Vue3/Vue2 单文件组件加载器。 在运行时从 html/js 动态加载 .vue 文件。无需 Node.js 环境,无需 (webpack) 构建步骤。 主要特征 支持 Vue 3 和 Vue 2(参见dist/)仅需…...

stm32移植嵌入式数据库FlashDB
本次实验的程序链接stm32f103FlashDB嵌入式数据库程序资源-CSDN文库 一、介绍 FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能…...

Ubuntu 安装Java、Git、maven、Jenkins等持续集成环境
Ubuntu 持续集成 安装OpenJdk 查看所有可安装的 JDK 版本 apt list OpenJDK\*使用 apt 安装 JDK(以 11为例),最好是用11,java8对应的jenkins会有兼容问题。 sudo apt install openjdk-11-jdk openjdk-11-jre安装成功后,可以使用以…...

文件批量重命名并批量修改文件扩展名,支持随机大小写字母命名并修改扩展名字母
在数字时代,文件的管理和整理成为了我们日常工作与生活中不可或缺的一部分。然而,面对堆积如山的文件,如何高效地对其进行重命名和修改扩展名,成为了许多人的难题。 第一步,进入文件批量改名高手的主页面,…...

【管理咨询宝藏70】MBB大型城投集团内外部环境分析报告
本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏70】MBB大型城投集团内外部环境分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套市…...

服务器挖矿病毒解决ponscan,定时任务解决
服务器挖矿病毒解决ponscan,定时任务解决 挖矿病毒会隐藏chattr的操作权限,让我们无法删除病毒文件,杀掉病毒进程。所以要去下载chattr.c的文件,编译成a.out。然后再对原来的chattr文件的权限进行修改。然后覆盖掉它。 chattr.c …...

【鸿蒙开发】第二十一章 Media媒体服务(二)--- 音频播放和录制
1 AVPlayer音频播放 使用AVPlayer可以实现端到端播放原始媒体资源,本开发指导将以完整地播放一首音乐作为示例,向开发者讲解AVPlayer音频播放相关功能。 以下指导仅介绍如何实现媒体资源播放,如果要实现后台播放或熄屏播放,需要…...
网络安全从入门到精通(特别篇I):Windows安全事件应急响应之Windows应急响应基础必备技能
Windows应急 询问攻击情况范围 事件发生时的状况或安全设备告警等,能帮助应急处置人员快速分析确定事件类型,方便前期准备。 通用排查思路 入侵肯定会留下痕迹,另外重点强调的是不要一上来就各种查查查,问清楚谁在什么时间发现的主机异常情况,异常的现象是什么,受害用…...

基于SpringBoot+Mybatis框架的私人影院预约系统(附源码,包含数据库文件)
基于SpringBootMybatis框架的私人影院预约系统,附源码,包含数据库文件。 非常完整的一个项目,希望能对大家有帮助哈。 本系统的完整源码以及数据库文件都在文章结尾处,大家自行获取即可。 项目简介 该项目设计了基于SpringBoo…...

【SERVERLESS】AWS Lambda上实操
通过Serverless的发展历程及带给我们的挑战,引出我们改如何改变思路,化繁为简,趋利避害,更好的利用其优势,来释放企业效能,为创造带来无限可能。 一 Serverless概述 无服务器计算近年来与云原生计算都是在…...

IDEA2023 开发环境配置
目录 1. 关闭IDEA自动更新1.2 IDEA 新版样式切换 2. Maven配置2.1本地仓库优先加载2.2 maven.config配置文件中 3. 全局配置JDK4. 配置文件编码:UTF-85. 开启自动编译(全局配置)6. 开启自动导包7. 开启鼠标悬浮(提示文档信息)8. 设…...

YOLOV5 + 双目相机实现三维测距(新版本)
文章目录 YOLOV5 双目相机实现三维测距(新版本)1. 项目流程2. 测距原理3. 操作步骤和代码解析4. 实时检测5. 训练6. 源码下载 YOLOV5 双目相机实现三维测距(新版本) 本文主要是对此篇文章做一些改进,以及解释读者在…...
【计算机网络】(一)计算机网络概述
文章目录 【计算机网络】(一)计算机网络概述前言1.1 计算机网络在信息时代中的作用1.2 互联网概述1.2.1 网络的网络1.2.2 互联网基础结构发展的三个阶段1.2.3 互联网标准化工作 1.3 互联网的组成1.3.1 互联网的边缘部分1.3.2 互联网的核心部分 1.4 计算机…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...