一休休的面试题

重点面试题(今天又看了很多的博客大概有个三十来篇吧所以总结了一休休的面试题):

ps:已经入秋了为什么还是这么热!!!

1、受管 bean 的生命周期

对于普通的 Java 对象,new 的时候会去创建对象,而当它没有任何引用的时候则被垃圾回收机制回收。相较于前者,由 Spring IoC 容器托管的对象,它们的生命周期完全由容器控制。

  • 对于 ApplicationContext 容器,当容器启动结束后,通过反射调用构造方法实例化所有的 Bean。

  • 设置对象属性,即依赖注入,动态将依赖关系注入到对象中。

  • 紧接着 Spring 会检测该对象是否实现 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean。顺序执行BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法

  • Bean 对象初始化前,循环调用实现 BeanPostProcessor 接口的预初始化方法 postProcessBeforeInitialization。

  • Bean 对象初始化时顺序执行@PostConstruct 注解方法、InitializingBean 接口方法、init-method 配置方法。

  • Bean 初始化后循环调用实现 BeanPostProcessor 接口的后初始化方法 postProcessAfterInitialization。

  • 容器关闭时执行 Bean 对象的销毁方法,顺序是@PreDestroy 注解方法、DisposableBean 接口方法、destroy-method 配置方法

bean 的 后 置 处 理 器 BeanPostProcessor 会 在 生 命 周 期 的 初 始 化 前 后 添 加 额 外 的 操 作 , 需 要 实 现BeanPostProcessor 接口,且配置到 IOC 容器中,需要注意的是后置处理器不是单独针对某个 bean 生效,而是针对 IOC 容器中所有 bean 都会执行
在这里插入图片描述

2、循环依赖是指两个或更多的组件之间存在着互相依赖的关系。

Spring 循环依赖:直接解决通过 setter 方法进行依赖注入且是在单例模式下产生的循环依赖问题。一级缓存 singletonObjects 缓存的是已经经历了完整生命周期的 bean 对象;二级缓存 earlySingletonObjects缓存的是早期的 bean 对象,就是属性还未填充完整。早期指的是 Bean 的生命周期还没走完就把这个 Bean 放入了 earlySingletonObjects;三级缓存singletonFactories 缓存的是 ObjectFactory,表示对象工厂,用来创建

某个对象的。

  • A 创建过程中需要 B,于是 A 将自己放到三级缓存里面,去实例化 B

  • B 实例化的时候发现需要 A,于是 B 先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了 A 然后把三级缓存里面的这个 A 放到二级缓存里面,并删除三级缓存里面的 A

  • B 顺利初始化完毕,将自己放到一级缓存里面,此时 B 里面的 A 依然是创建中状态,然后回来接着创建 A,

此时 B 已经创建结束,直接从一级缓存里面拿到 B,然后完成创建,并将 A 放到一级缓存中。因为整个过程中,都只有一个 A 原始对象,所以对于 B 而言,就算在属性注入时,注入的是 A 原始对象,也没有关系,因为 A

原始对象在后续的生命周期中在堆中没有发生变化。

在 SpringBoot 应用程序中,循环依赖通常是由三种情况引起的:1、构造函数循环依赖:两个或更多的组件在它们的构造函数中互相依赖。2、属性循环依赖:两个或更多的组件在它们的属性中互相依赖。3、方法循环依赖:两个或更多的组件在它们的方法中互相依赖。在 2.6.0 前 Spring Boot 会自动处理循环依赖的问题。2.6.0及之后的版本会默认检查循环依赖,存在该问题则会报错。

通用解决方案为延迟注入,使用@Lazy 注解延迟加载依赖项。

@Component
public class A {private final B b;public A(@Lazy B b) { //既可用于构造器参数,也可以用于设置器参数this.b = b; }
}

3、starter 工作原理

SpringBoot 这些 starter 的作用就是根据配置给初始化整合其他框架时需要初始化的一些 bean,并加载到spring 容器中。这样就减少了在 SSM 时代那些繁琐的是 xml 配置。

@EnableAutoConfiguratio 注 解 使 用 Import 引 入AutoConfigurationImportSelector 类 , 而AutoConfigurationImportSelector 类通过 SpringFactortisLoader 加载了所有 jar 包的 MATE-INF 文件夹下的spring.factories 文件,

spring.factories 包含所有需要装配的 XXXConfiguration 类的全限定名。XXXConfiguration类包含了实例化该类需要的信息,比如个数据源 Configuration 类,那么就应该有数据库驱动、用户名、密码等信息。

  • SpringBoot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。

  • 根据 spring.factories 配置加载 AutoConfigure 类

  • 根据@Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

4、SpringBoot 的启动流程

@SpringBootApplication 注解实际上是 SpringBoot 提供的一个复合注解,由三个注解组成:

  • @SpringBootConfiguration 来源于@Configuration,二者功能都是将当前类标注为配置类,并将当前类里以@Bean 注解标记的方法的实例注入到 spring 容器中。

  • @EnableAutoConfiguration 启用自动配置,可以帮助 SpringBoot 应用将所有符合条件的@Configuration 配置都加载到当前 IoC 容器之中。

  • @ComponentScan 对应于 XML 配置形式中的 context:component-scan,用于将一些标注特定注解的 bean定义批量采集注册到 Spring 的 IoC 容器之中,特定注解包括@Controller、@Component、@Service 和@Repository。

因此@SpringBootApplication 注解主要作为一个配置类,能够触发包扫描和自动配置的逻辑,从而使得SpringBoot 的相关 bean 被注册进 Spring 容器。这里使用了 spring.factories 文件来完成自动配置,提高了扩展性。在启动时使用观察者模式,以事件发布的形式通知,降低耦合,易于扩展等

1 、 首 先 创 建 SpringApplication 对 象 并 初 始 化 属 性 , 例 如 资 源 加 载 器 resourceLoader 、 启 动 类mainApplicationClass 、webApplicationType 类 型 、 初 始 化 器 initializers 和 listeners 。 从 类 路 径 下 找 到META/INF/Spring.factories 配置的所有 ApplicationContextInitializer 和 ApplicationListener,然后保存起来

2、调用 springApplication.run(args)方法

2.1 、 通 过 SpringFactoriesLoader 加 载 META-INF/spring.factories 文 件 , 获 取 并 创 建SpringApplicationRunListener 对象,并自动回调启动。然后由 SpringApplicationRunListener 来发出 starting

消息。

2.2 、 创 建 参 数 , 并 配 置 当 前 SpringBoot 应 用 将 要 使 用 的 Environment 。 完 成 后 , 依 然 由SpringApplicationRunListener 来发出 environmentPrepared 消息。2.3、创建 IoC 容器 ApplicationContext 对象。初始化 ApplicationContext 并设置 Environment,加载相关配置等。由 SpringApplicationRunListener 来发出 contextPrepared 消息,告知 SpringBoot 应用使用的ApplicationContext 已准备 OK。2.4、将各种 beans 装载入 ApplicationContext,继续由SpringApplicationRunListener 来发出 contextLoaded消息,知 SpringBoot 应用使用的 ApplicationContext 已装填 OK。2.5、refresh ApplicationContext 刷新容器,扫描、创建、加载所有组件完成 IoC 容器可用的最后一步。由SpringApplicationRunListener 来发出 started 消息。2.6、从 IoC 容器中获取所有的 ApplicationRunner 和 CommandLineRunner 进行回调完成最终的程序的启动。由 SpringApplicationRunListener 来发出 running 消息,告知程序已运行起来了,并停止计时器。

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

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

相关文章

记录--用css画扇形菜单

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1、效果图 用手机录屏再用小程序转换的gif,可能精度上有点欠缺。 2、实现过程 1、观察及思考 开始编码前我们首先观察展开后的结构:两个四分之一的圆加三个圆形菜单项。 文章名…

Tomcat的动静分离以及多实例部署

一、动静分离 Nginx实现负载均衡的原理: Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。 但不是把所有的web请求转发,而是将静态页面请求Ncinx服务器自己来处…

【C++起飞之路】初级—— auto、范围for循环、宏函数和内联函数

auto、范围for、内联函数、宏函数和nullptr 一、auto — 类型推导的魔法(C 11)1、auto 是什么?2、工作原理3、优势4、限制和注意事项 二、范围for (C11)1、基本语法2、优势3、工作原理4、注意事项5、C11: 范围 for 循环的扩展: 三…

如何预防ssl中间人攻击?

当我们连上公共WiFi打开网页或邮箱时,殊不知此时可能有人正在监视着我们的各种网络活动。打开账户网页那一瞬间,不法分子可能已经盗取了我们的银行凭证、家庭住址、电子邮件和联系人信息,而这一切我们却毫不知情。这是一种网络上常见的“中间…

刨根问底,不再纠结Linux 文件权限问题

Linux 与Windows的区别 与Windows 系统不一样,在Linux系统中,无论是系统内核还是应用程序,都是文件。正如此,当你学习Linux中遇到问题时,总能看到热心网友的解决方法: rm -rf * 一旦运行此命令&#x…

Maven 基础学习及使用

Maven1 Maven简介1.1 Maven模型1.2 仓库 2 Maven安装配置3 Maven基本使用3.1 Maven 常用命令3.2 Maven 生命周期 4 IDEA使用Maven4.1 IDEA配置Maven环境4.2 Maven 坐标详解4.3 IDEA 创建 Maven项目4.4 IDEA 导入 Maven项目 5 依赖管理5.1 使用坐标引入jar包5.2 依赖范围 Maven …

STM32的电动自行车信息采集上报系统(学习)

摘要 针对电动自行车实时监管不便的问题,设计了一种基于STM32的电动自行车信息采集系统,通过获取电池、位置和行驶状态信息并上报到服务器中,实现实时监管。 通过多路串口请求电池、行驶状态和位置信息,以并发方式进行数据接收、…

块、行内块水平垂直居中

1.定位实现水平垂直居中 <div class"outer"><div class"test inner1">定位实现水平垂直居中</div></div><style>.outer {width: 300px;height: 300px;border: 1px solid gray;margin: 100px auto 0;position: relative;}.te…

Redis集群(三十七)

部署搭建Redis主从复制、哨兵模式、集群部署 目录 一、Redis主从复制 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;作用 &#xff08;三&#xff09;缺点 &#xff08;四&#xff09;流程 &#xff08;五&#xff09;搭建 二、Redis哨兵模式 &#xff0…

软件测试基础篇——MySQL

MySQL 1、数据库技术概述 数据库database&#xff1a;存放和管理各种数据的仓库&#xff0c;操作的对象主要是【数据data】&#xff0c;科学的组织和存储数据&#xff0c;高效的获取和处理数据SQL&#xff1a;结构化查询语言&#xff0c;专为**关系型数据库而建立的操作语言&…

ORB-SLAM2第二节---双目地图初始化

比起单目初始化&#xff0c;而双目实现地图的初始化非常简单&#xff0c;只需要一帧&#xff08;左右目图像&#xff09;即可完成初始化。 行特征点统计。考虑用图像金字塔尺度作为偏移量&#xff0c;在当前点上下正负偏移量&#xff08;r)内的纵坐标值都认为是匹配点可能存在…

【MySQL】并发执行事务可能存在的问题, 事务的四种隔离级别

文章目录 前言一、并发执行事务可能存在的问题1, 脏读问题2, 不可重复读3, 幻读 二、MySQL 的四种隔离级别1, READ UNCOMMITTED 读未提交2, READ COMMITTED 读已提交3, REPEATABLE READ 可重复读 (MySQL 的默认事务隔离级别)4, SERIALIZABLE 串行化 总结 前言 各位读者好, 我是…

web会话跟踪以及JWT响应拦截机制

目录 JWT 会话跟踪 token 响应拦截器 http是无状态的&#xff0c;登录成功后&#xff0c;客户端就与服务器断开连接&#xff0c;之后再向后端发送请求时&#xff0c;后端需要知道前端是哪个用户在进行操作。 JWT Json web token (JWT), 是为了在网络应用环境间传递声明而…

WebAPIs 第三天

DOM 事件进阶 事件流事件委托其他事件元素尺寸与位置 一.事件流 事件流与两个阶段说明事件捕获事件冒泡阻止冒泡解绑事件 1.1 事件流与两个阶段说明 ① 事件流&#xff1a;指的是事件完整执行过程中的流动路径 ② 事件流分为捕获阶段和冒泡阶段 1.2 事件捕获 从DOM根元素…

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效&#xff0c;在其他页监听无效。 onLaunch&#xff1a;当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;on…

AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

大家好&#xff0c;我是风雨无阻。 本文适合人群&#xff1a; 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容&#xff1a; Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

邻接表创建无向表(C++ 代码)

#include<iostream>//邻接表创建无向表 #define MVNum 100 using namespace std; typedef char VerTexType; typedef struct Arcnode//边节点 {int adjvex;//该边所指向的顶点的位置struct Arcnode* nextarc;//指向下一条边的指针 }Arcnode; typedef struct vnode//顶点节…

【瑞吉外卖】Linux学习

Linux常用命令 Linux命令初体验 Linux的命令都是由一个或几个单词的缩写构成的 命令对应英文作用lslist查看当前目录下的内容pwdprint work directory查看当前所在目录cd [目录名]change directory切换目录touch [文件名]touch如果文件不存在&#xff0c;新建文件mkdir [目录…

软件测试基础篇——LAMP环境搭建

LAMP 1、Linux系统的其他命令 find命令&#xff1a;在目录下查找文件 ​ 格式一&#xff1a;find 路径 参数 文件名 ​ 路径&#xff1a;如果没有指定路径&#xff0c;默认是在当前目录下 ​ 参数&#xff1a;-name 根据文件名来查找&#xff0c;区分大小写&#xff1b; -…