一休休的面试题

news2025/1/10 2:39:31

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

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.coloradmin.cn/o/873177.html

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

相关文章

Redis进阶(3)——在Linux上基于Docker容器Redis搭建一主二从三哨兵 SpringBoot整合Redis哨兵

目录 引出redis主从搭建:一主2从6389Master准备文件redis.confredis.log日志文件运行容器查看日志方式tail 6390Slave6391Slave 创建3哨兵创建文件夹sentinel创建运行哨兵容器问题:脑裂问题 SpringBoot整合Redis哨兵启动1主2从,3哨兵pom.xml文…

聊聊服务端缓存那些事(预热、淘汰、污染、雪崩、穿透、击穿等)

文章目录 概要一、缓存预热二、缓存污染2.1、先更新数据库再更新缓存2.2、先更新缓存再更新数据库2.3、先删除缓存再更新数据库,读时再更新2.4、先更新数据库再删除缓存,读时再更新2.5、缓存污染总结2.6、删除缓存失败了怎么办?2.7、延迟双删…

【数据结构与算法】十大经典排序算法-堆排序

🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…

JZ33二叉搜索树的后序遍历序列

题目地址:二叉搜索树的后序遍历序列_牛客题霸_牛客网 题目回顾: 解题思路: 使用栈 栈的特点是:先进后出。 通读题目后,我们可以得出,二叉搜索树是左子节点小于根节点,右子节点大于根节点。 …

wps设置一键标题字体和大小

参考 wps设置一键标题字体和大小:https://www.kafan.cn/A/7v5le1op3g.html 统一一键设置

[FPGA IP系列] 2分钟了解FPGA中的BRAM

FPGA设计中,BRAM是一项非常关键的内置存储资源,FPGA开发需要熟练使用BRAM,今天再复习一下BRAM的知识,包括BRAM的定义、组成、应用等等。 一、BRAM介绍 1、BRAM的定义 RAM是Random Access Memory,也就是随机访问数据…

C字符串练习题(6.3.1)

编写一个程序&#xff0c;从键盘上读入一个小于1000的正整数&#xff0c;然后创建并输出一个字符串&#xff0c;说明该整数的值。例如&#xff0c;输入941&#xff0c;程序产生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

【STM32】FreeRTOS互斥量学习

互斥量&#xff08;Mutex&#xff09; 互斥量又称互斥信号量&#xff08;本质也是一种信号量&#xff0c;不具备传递数据功能&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性…

Spring Boot 项目实现 Spring AOP

【注】实现在SpringBoot项目中&#xff0c;同时给两个类的方法添加AOP前置通知 1、创建一个SpringBoot项目 2、创建两个目标类和方法 package com.tqazy.learn_spring_project.spring_aop;import org.springframework.stereotype.Service;/*** ClassName SpringAopUserServi…

【树状数组优化哈希DP】CF1801 C

Problem - C - Codeforces 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define lowbit(x) (x & (-x))using i64 long long;constexpr int N 2e5 10; constexpr int mod 1e9 7;std::vector<int> V[N];int n, m, x, mxv 0; int a[N], id[N…

MySQL入门学习教程(一)

mysql简介 1、什么是数据库 &#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它产生于距今六十多年前&#xff0c;随着信息技术和市场的发展&#xff0c;特别是二十世纪九十年代以后&#xff0c;数据管理不再仅仅…

学习笔记整理-JS-02-基本类型

文章目录 一、数据类型简介和检测1. JavaScript中两大数据类型 二、基本数据类型1. 数字类型2. 字符串类型3. 布尔类型4. undefined类型5. null 三、数据类型的转换1. 数据类型的转换 四、重点内容 一、数据类型简介和检测 1. JavaScript中两大数据类型 基本数据类型 Number S…

Android学习之路(3) 布局

线性布局LinearLayout 前几个小节的例程中&#xff0c;XML文件用到了LinearLayout布局&#xff0c;它的学名为线性布局。顾名思义&#xff0c;线性布局 像是用一根线把它的内部视图串起来&#xff0c;故而内部视图之间的排列顺序是固定的&#xff0c;要么从左到右排列&#xf…

最强自动化测试框架Playwright(22)-模拟器

可以使用测试生成器通过仿真生成测试&#xff0c;以便为特定窗口、设备、配色方案生成测试&#xff0c;以及模拟地理位置、语言或时区。测试生成器还可以生成测试&#xff0c;同时保留经过身份验证的状态。 模拟视口大小 Playwright 打开一个浏览器窗口&#xff0c;其视口设置…

电路基础之电容

电容器&#xff08;Capacitor&#xff09;是由两个导体电极之间夹着一个电介质而组成的元件。这两个电极可以是金属板、箔片、涂层等&#xff0c;而电介质则是放置在电极之间的绝缘材料。电容器的基本构成包括以下几个要素&#xff1a; 电极&#xff1a;电容器的电极是两个导体…

无涯教程-Perl - readpipe函数

描述 该函数将EXPR作为命令执行。然后,将输出作为标量文本中的多行字符串返回,或者将行作为列表context中的单个元素返回。 语法 以下是此函数的简单语法- readpipe EXPR返回值 此函数在标量context中返回String,在列表context中返回List。 例 以下是显示其基本用法的示…

HTML详解连载(6)

HTML详解连载&#xff08;6&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽CSS特性继承性注意 层叠性特点 优先级规则公式注意 叠加计算公式&#xff08;每以及之间不存在进位&#xff09;规则 Emmet写法分析属性名属性值注意 背景图平铺方式属性…

【分布式存储】数据存储和检索~B+树

为什么数据存储结构重要 在存储系统中&#xff0c;其实不管数据是什么样的&#xff0c;归根结底其实都还是取决于数据的底层存储结构&#xff0c;而主要常见的就是数据库索引结构&#xff0c;B树、Redis中跳表、以及LSM、搜索引擎中的倒排索引。本质都是如何利用不用的数据结构…

群辉nas看剧设置

首先打开NAS的后台页面&#xff0c;打开“控制面板” 然后依次点开“文件服务--SMB--高级设置”&#xff0c;在最小SMB协议后面的方框选择“SMB1"&#xff0c;然后点击”保存“按钮即可&#xff0c;这里这样设置的原因是因为还有很多旧设备只支持SMB1&#xff08;我几年前…