【2024最新精简版】SpringBoot面试篇

news2024/11/25 2:47:40

在这里插入图片描述

文章目录

  • Spring和SpringBoot的区别 ?
  • 讲一讲SpringBoot自动装配的原理👍
  • 讲一讲SpringBoot启动流程
  • 你们常用的Starter有哪些👍
  • 如何定义一个SpringBoot的starter 👍
  • SpringBoot支持的配置文件有哪些👍
  • 讲一讲SpringBoot项目配置文件的加载顺序👍
  • SpringBoot的核心注解是哪个?👍
  • Spring Boot 中如何解决跨域问题👍
  • SpringBoot项目如何实现配置的热更新 ? 👍
  • springboot打出来的jar包跟普通的jar包有什么区别

更多相关内容可查看

Spring和SpringBoot的区别 ?

Spring是一个开源容器框架, 其核心就是控制反转 (IOC),和面向切面 (AOP), 简单的说就是一个分层的轻量级开源框架
Spring Boot它是一个基于Spring的快速开发框架,可以帮助开发者快速构建基于Spring的应用程序
SpringBoot的核心就是 自动配置依赖版本管理

讲一讲SpringBoot自动装配的原理👍

在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication
image.png
这个注解是一个复合注解, 其中有三个注解构成 , 分别是
image.png

  • @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类
  • @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包
  • @EnableAutoConfiguration : 开启自动配置(自动配置核心注解)

在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoConfigurationImportSelector.class的类
image.png
在AutoConfigurationImportSelector.class中的selectImports方法内通过一系列的方法调用, 最终需要加载类加载路径下META-INF下面的spring.factories配置文件
在META-INF/spring.factories配置文件中, 定义了很多的自动配置类的完全限定路径
image.png
这些配置类都会被加载
加载配置类之后, 会配置类或者配置方法上的@ConditionalOnXxxx条件化注解是否满足条件
image.png
如果满足条件就会使用@ConfigurationProperties注解从属性配置类中读取相关配置 , 执行配置类中的配置方法 , 完成自动配置
image.png

讲一讲SpringBoot启动流程

SpringBoot项目启动都会执行一个main方法 , main方法中调用SpringApplication.run()方法启动程序 , 整个应用启动包括二部分 , 首先先构建SpringApplication对象, 然后执行run方法
image.png
构造SpringApplication的时候会进行初始化的工作,初始化的时候会做以下几件事:

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    Assert.notNull(primarySources, "PrimarySources must not be null");
    //1. 把primarySources设置到SpringApplication属性中 , 这个primarySources就是启动引导类字节码
    this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
    //2. 判断是否是web程序,并设置到webEnvironment的boolean属性中
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    //3. 创建并初始化ApplicationInitializer,设置到initializers属性中 
    this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
    //4. 创建并初始化ApplicationListener,设置到listeners属性中 
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
    //5. 初始化主类mainApplicatioClass
    this.mainApplicationClass = this.deduceMainApplicationClass();
}
  1. SpringApplication构造完成之后调用run方法,启动SpringApplication,run方法执行的时候会做以下几件事:
public ConfigurableApplicationContext run(String... args) {
    //1. 构造一个StopWatch计时器,用来记录SpringBoot的启动时间
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    ConfigurableApplicationContext context = null;
    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
    this.configureHeadlessProperty();
    //2. 初始化监听器,获取SpringApplicationRunListeners并启动监听,用于监听run方法的执行
    SpringApplicationRunListeners listeners = this.getRunListeners(args);
    listeners.starting();

    Collection exceptionReporters;
    try {
        //3. 创建并初始化ApplicationArguments,获取run方法传递的args参数
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        //4. 创建并初始化ConfigurableEnvironment(环境配置)
        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
        this.configureIgnoreBeanInfo(environment);
        //5. 打印banner和版本
        Banner printedBanner = this.printBanner(environment);
        //6. 构造Spring容器(ApplicationContext)上下文 , 发布上下文初始化事件(通知监听器执行)
        context = this.createApplicationContext();
        exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
        //7. 准备Spring容器 , 将环境变量 , 监听器 , 应用参数注册到容器中
        this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        //8. 刷新上下文 , 自动装配和启动 tomcat就是在这个方法里面完成的
        this.refreshContext(context);
        this.afterRefresh(context, applicationArguments);
        //9. StopWatch计时器停止计时,日志打印总共启动的时间
        stopWatch.stop();
        if (this.logStartupInfo) {
            (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
        }
    	//10. 发布SpringBoot程序已启动事件
        listeners.started(context);
        //11. 执行自定义的run方法 , 主要就是通知ApplicationRunner 和 CommandLineRunner 接口中的run方法执行 
        this.callRunners(context, applicationArguments);
    } catch (Throwable var10) {
        this.handleRunFailure(context, var10, exceptionReporters, listeners);
        throw new IllegalStateException(var10);
    }

    try {
        //最后发布就绪事件ApplicationReadyEvent,标志着SpringBoot可以处理就收的请求了
        listeners.running(context);
        return context;
    } catch (Throwable var9) {
        this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
        throw new IllegalStateException(var9);
    }
}

你们常用的Starter有哪些👍

常用的Starter有很多 , 例如 :

  1. spring-boot-starter-web
  2. spring-boot-starter-jdbc
  3. mybatis-spring-boot-starter
  4. spring-boot-starter-test
  5. mybatis-plus-spring-boot-starter
  6. spring-boot-starter-data-redis
  7. spring-boot-starter-data-elasticsearch
  8. spring-boot-starter-data-mongodb
  9. spring-boot-starter-amqp
  10. spring-cloud-starter-openfeign
  11. spring-cloud-starter-alibaba-nacos-discovery

如何定义一个SpringBoot的starter 👍

我们项目中其实也有自定义Starter , 主要用于封装一些复杂的操作, 让开发更加高效简单 , 我们项目中主要做的Starter主要包括 :

  1. 阿里云OSS的Starter
  2. 阿里云内容安全服务的Starter
  3. Minio的Starter
  4. 聚合支付的Starter
  5. EMQX的Starter

自己定义Starter也不难 , 我们在做的过程中 , 首先会梳理清楚这个Starter的核心功能和作用 , 将一些核心的操作封装为方法 , 封装到一个模板类中, 例如 : AliyunOssTempalte,AliyunGreenTempalte,MinioTemplate之类的 , 这个过程其实比较麻烦
然后就抽取一些经常会变化的配置内容 , 例如 : 一些基本的连接地址配置 , 密钥配置等 , 提供属性配置类(XxxProperties) , 通过@ConfigurationProperties注解读取配置文件到配置类
之后就创建一个自动配置类 , 在自动配置类中配置starter运行需要的一些基本配置 , 例如 : 连接工厂配置, 客户端对象配置 , 一些需要的Bean的配置 以及 需要用到的模板对象配置等 , 设置好生效条件@ConditionalOnXxx
最后就是在项目类加载路径下创建spring.factories配置文件 , 在配置文件中配置自动配置类的全路径就可以了
Starter封装好了之后, 后期项目中使用只需要引入Starter依赖 , 在配置文件中配置所需要的信息 , 就能够完成自动配置 , 注入模板类就能够使用了

SpringBoot支持的配置文件有哪些👍

springboot支持二种类型的配置文件

  1. properties属性配置文件
  2. yaml配置文件

配置文件必须放置在项目的类加载目录下, 并且名字必须是application
springboot项目在运行的时候会自动加载这些配置文件
还有一种是引导配置文件 , 名字叫bootstrap , 类型可以是properties也可以是yaml , 他会在application配置文件之前加载, 一般用于读取配置中心相关信息

讲一讲SpringBoot项目配置文件的加载顺序👍

SpringBoot项目的配置形式有很多种 , 如下所示 :

  1. 外部配置中心配置 , 例如 spring cloud configNacos中的配置
  2. 命令行参数配置
  3. 操作系统环境变量配置
  4. 通过spring.config.location参数指定的配置文件
  5. 配置文件(YAML文件、Properties 文件) , Properties配置优先级高于YAML
  6. @Configuration 注解类上的 @PropertySource 指定的配置文件

以上所有形式的配置都会被加载 , 优先级由高到低,当存在相同配置内容时,高优先级的配置会覆盖低优先级的配置;存在不同的配置内容时,高优先级和低优先级的配置内容取并集,共同生效,形成互补配置

SpringBoot的核心注解是哪个?👍

Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 :

  1. @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能
  2. @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
  3. @ComponentScan:Spring组件扫描 , 默认扫描启动引导类所在包以及子包

Spring Boot 中如何解决跨域问题👍

SpringMVC项目中使用@CrossOrigin注解来解决跨域问题 , 本质是CORS

@RequestMapping("/hello")
@CrossOrigin(origins = "*")
//@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
public String hello() {
    return "hello world";
}

SpringBoot项目采用自动配置的方式来配置CORS , 可以通过实现 WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

在SpringCloud项目中一般都会有网关 , 在网关中可以配置CORS跨域, 这样所有通过网关的请求都解决了跨域问题

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有请求
            allowedOrigins: "*" #跨域处理 允许所有的域
            allowedMethods: # 支持的方法
              - GET
              - POST
              - PUT
              - DELETE

SpringBoot项目如何实现配置的热更新 ? 👍

SpringBoot项目读取配置文件常用的方式有二种 :

  1. 通过@Value注解通过属性名称读取
  2. 通过@ConfigurationProperties属性 , 批量读取配置文件配置到属性配置类

实现热更新的方式也有二种 :

  1. @Value + @RefreshScope注解实现热更新
  2. 通过@ConfigurationProperties注解读取的属性, 自动会热更新

springboot打出来的jar包跟普通的jar包有什么区别

Spring Boot 打包出来的 JAR 包与普通的 JAR 包在一些方面有所不同,这些差异主要体现在以下几个方面:

  1. 嵌入式容器: Spring Boot 的 JAR 包包含一个的 Servlet 容器(如Tomcat、Jetty、Undertow等),这意味着你可以直接运行 JAR 包而不需要外部容器。
  2. 可执行性: Spring Boot 打包出来的 JAR 包通常是可执行的,这意味着你可以直接通过命令行或脚本来运行它。这对于部署和运维来说非常方便,因为你只需将 JAR 包传输到目标服务器上,并通过命令即可启动应用程序。
  3. Fat JAR: Spring Boot 打包出来的 JAR 包通常是 Fat JAR,也就是说它包含了所有的依赖库和资源文件。这样一来,你就不需要手动管理类路径和依赖了,应用程序的部署和运行也更加简单。

总的来说,Spring Boot 打包出来的 JAR 包具有更高的集成性、自动化程度和可执行性,使得开发、部署和运维过程更加简单和高效。

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

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

相关文章

用Python比较对象==与is,你还在用==?out啦,来看这个!

目录 1、基础比较:== 和 is 📐 1.1 ==:值的比较 1.2 id()函数揭秘对象身份 1.3 is:身份的辨识 1.4 实战演练:列表、字典的比较陷阱 列表比较陷阱 2、深入理解比较操作符 🌀 2.1 不等号的妙用 2.2 成员资格in操作 3、自定义比较:__eq__等魔法方法 🎩 3.1 重…

蓝队-溯源技巧

溯源技巧 大致思想 通常情况下&#xff0c;接到溯源任务时&#xff0c;获得的信息如下 攻击时间 攻击 IP 预警平台 攻击类型 恶意文件 受攻击域名/IP其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。 通过攻击类型分析攻击详情的请求包&#xff0c;看有没有攻击者…

1586. 扫地机器人

问题描述 Mike同学在为扫地机器人设计一个在矩形区域中行走的算法,Mike是这样设计的:先把机器人放在出发点 (1,1)(1,1) 点上,机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向…

分布式数据库核心问题和解决方法

当下&#xff0c;由于成本压力以及数据保护的要求&#xff0c;采用国产数据库的呼声越来越高&#xff0c;但是国产数据库数量众多&#xff0c;良莠不齐&#xff0c;没有选择数据库比较靠谱的标准&#xff0c;业内真正懂得数据库的人很少&#xff0c;且为了这块大的蛋糕&#xf…

《C语言深度解剖》(19):从头开始全面理解C语言指针和数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

实例详解C/C++中static与extern关键字的使用

目录 1、概述 2、编译C++代码时遇到的变量及函数重复定义的问题 3、用 extern 声明外部变量 4、extern与全局函数 5、为何在变量和函数前添加一个static关键字编译就没问题了呢? 6、静态局部变量 7、函数的声明与定义都放置到一个头文件中,不使用static,通过宏控制去…

广东启动“粤企质量提升工作会议” 着力提升产品和服务质量

6月5日,由广东质量峰会组委会牵头,联合相关质量、信用、打假和检验检测等部门共同举办的“粤企质量提升工作会议”在广州正式启动。本次工作会议旨在贯彻落实《质量强国建设纲要》及《广东省质量强省建设纲要》精神,深入开展全民质量行动,弘扬企业家和工匠精神,营造政府重视质量…

实战17:GCN+LSTM图卷积神经网络预警预测 完整代码数据集

直接看视频演示: GCN+LSTM图卷积神经网络预警预测时间序列预测_哔哩哔哩_bilibili 模型图原理: 完整代码: import torch import torch.nn as nn import torch.optim as optim from torch_geometric.nn import GCNConv from torch.utils.data import DataLoader, TensorDat…

十二星座女、具有哪些情感特质。

白羊座&#xff08;奋不顾身&#xff09;。金牛座&#xff08;爱财如命&#xff09;。双子座&#xff08;灵活多变&#xff09;。 巨蟹座&#xff08;似水柔情&#xff09;。狮子座&#xff08;光明磊落&#xff09;。处女座&#xff08;尽善尽美&#xff09;。 天秤座&#xf…

【Unity学习笔记】第十八 基于物理引擎的日月地系统简单实现

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139701843 作者&#xff1a;CSDN|Ringleader| 目录 目标数学理论资源准备数据准备代码实现Unity准备效果展示注意事项后记 目标 目标&#xff1a;利用Unity的物理引擎实现 “日地月三体系统” 。 效果…

CubeMX Keil Configure

// 使用外部高速晶振 外部高速晶振为8M&#xff08;根据开发板上的晶振频率设置&#xff09;&#xff0c;使用 PLLCLK&#xff0c;HSE 选项 USART1 使用 Asynchronous&#xff0c;PA9&#xff0c;PA10引脚&#xff08;USART1 引脚根据开发板上引脚设置&#xff09; 设置MDK AR…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] URL拼接(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 URL拼接(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

Pixel Transformer:用像素代替补丁可以提升图像分类精度

在快速发展的人工智能领域&#xff0c;ViTs已成为各种计算机视觉任务的基础模型。ViTs通过将图像划分为小块并将这些小块作为标记来处理图像。6月刚发布一篇论文&#xff0c;引入了一种新颖的方法&#xff0c;即像素级Transformers&#xff0c;它通过将单个像素视为令牌来挑战这…

大数据实训项目(小麦种子)-03、大数据环境Hadoop、Mapreduce、Hive、Hbase、HDFS搭建服务及调试

文章目录 前言一、Linux系统Centos7安装配置JDK8二、Linxu系统Centos7中搭建Hadoop3.1.0服务下载地址服务1&#xff1a;详细步骤&#xff08;初始化与启动dfs服务&#xff09;详细步骤配置环境变量 服务2&#xff1a;Hadoop(YARN)环境搭建 三、Linux系统搭建Hive3.1.2服务前提条…

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群

桂电人工智能学院大数据实验&#xff0c;使用 Docker 搭建 hadoop 集群 第一步 安装 Docker, Windows 上可以使用 Docker Desktop 下载地址&#xff1a;https://www.docker.com/products/docker-desktop/ 安装过程自行谷歌 安装好的标志&#xff1a;打开终端 运行docker p…

产品人生(13):从“产品的RFM分析”看如何探索“职业方向”

我们在做产品分析时&#xff0c;经常会用到一种方法“产品的RFM分析”&#xff0c;它是一种客户细分和价值评估的常用方法&#xff0c;广泛应用于电子商务、零售和其他众多行业&#xff0c;它可以帮助企业和产品团队更好地理解用户行为&#xff0c;优化营销策略&#xff0c;提升…

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…

国外视频搬运素材去哪里找?可搬运下载国外的素材网站库分享

如果你正在寻找高质量的国外视频素材来提升你的视频制作水平&#xff0c;不用担心&#xff0c;今天我将为大家推荐几个知名的视频素材网站&#xff0c;让你轻松找到理想的素材资源。 蛙学府 首先推荐的是国内非常受欢迎的“蛙学府”。蛙学府是一个综合性网站&#xff0c;专门提…

通过Navicat Premium进行sql文件互转db文件

目录 一、获取原来数据sql文件 二、通过sql文件转换db文件 三、db文件转换成功 一、获取原来数据sql文件 原数据main右键》转储SQL文件》结构和数据》main.sql 二、通过sql文件转换db文件 新建db文件》Navicta》新建SQLite(SQ)》导入db文件》 main右键》运行SQL文件》 mai…

【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】

调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调…