SpringBoot启动时做了哪些工作(同花顺面试篇)

2023-10-31

在北漂了几个月后,拿到了几个还行的offer,然后跑来了心心念念的杭州。讲实话,杭州各方面我还是比较有好感的,如果非要说一点不好的,那一定是“杭州太不尊重冬天了”(你品,你细品!!)

鄙人目前虽然是在摄像头大厂混吃混喝,但是面对她的主动邀请(同花顺在拉勾私信俺,相信很多人碰见过类似情况吧!这些公司简直是渣男行径啊,大面积撒网,小范围捕捞),出于尊重也就投递了简历约定了面试。先不说问了写啥吧,因为之前对她的情况了解一些,知道她的PHP是正式生的,Java的话是后娘养的。这个在跟面试官交流的时候也证实了,得知他们Java是刚成立的,有一个三年的Java做负责人,剩下的基本都是应届生了吧,所以我就呵呵了!!

这里主要有两个让我比较印象深的问题。一个自然是SpringBoot的启动过程,另一个是容器部署时需要配置哪些JVM参数,对JVM参数和优化了解多少。
在这里我们先聊一聊SpringBoot这个东东,另一个在下一篇分享。

我们知道SpringBoot是一个在使用,搭建优于SSM框架的流行框架。它的优势在于Spring starter解决bean之间的依赖和内置Tomcat。虽然用的是简便舒服,但是知其然,不知其所以然的感觉不是俺想要的哦!所以,下面从SpringBoot的@SpringBootApplication这个注解切入。首先我们来看看这个注解的作用是什么。

一 @SpringBootApplication的作用
@SpringBootApplication由以下三个注解组成:

  1. @SpringBootConfiguration
  2. EnableAutoConfiguration
  3. ComponentScan
    在这里插入图片描述
  • @SpringBootConfiguration,让我们看看它里面有什么东东。
    在这里插入图片描述
    原来@SpringBootConfiguration里面也就是个@Configuration,而@Configuration注解的作用是把一个Java类做成一个JavaConfig类,能够将其中的bean设置到IOC容器里面。@Configuration的用法如下:
    在这里插入图片描述
    @Bean的作用是将方法的返回值作为实例注入到IOC容器里面,并在当前程序的上下文起作用,并且该实例的ID默认方法名。
    @SpringBootConfiguration的作用还有另外一个就是将当前启动类作为一个扩展类,当有额外配置时,直接@import即可。
    在这里插入图片描述
  • @ComponentScan的作用是扫描@Component,@Service等组件,然后注入到IOC容器里。
    在这里插入图片描述
  • @EnableAutoConfiguration是SpringBoot中最为重要的组件,其中重要之处在于AutoConfigurationImportSelector.class。

在这里插入图片描述
这里出现了Spring自带的工具:SpringFactoriesLoader,这个工具是去读“META-IN/spring.factories”下的文件,这个文件里都是配置类的全限定名。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在拿到类的全限定名之后通过反射的手段获取类的实例,然后注入到IOC容器中。
总结一下:@SpringBootApplication先通过@Configuration将启动类做成一个配置类,然后通过@EnableAutoConfiguration将spring.factories中的配置类注入到IOC容器中,再通过@Conponent扫描其他组件将其注入到IOC中。

二 SpringBoot的启动过程
SpringBoot启动后主要做的就是如下这些动作!

  • 当我们运行SpringBoot的main方法时,调用run()方法首先是实例化,实例化主要做三件事:
    (1)根据classpath判断是否启动一个webapplicationContext.
    (2)SpringFactoriesInstances加载classpath下所有可用的ApplicationContextInitializer.
    (3)SpringFactoriesInstances加载classpath下所有可用的ApplicationListener
    在这里插入图片描述
  • SpringApplication实例化完成后,调用run()方法,会调用SpringApplicationRunListeners,然后调用starting()方法,开启监听。
    在这里插入图片描述
  • 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,将配置环境加入到监听器对象中。
  • banner属性的设置

在这里插入图片描述

  • ConfigurableApplicationContext应用配置上下文的创建,根据webEnvironment是否是web环境创建默认的contextclass,最后通过BeanUtils实例化上下文对象,并返回。

在这里插入图片描述

  • prepareContext()方法是将listeners,environment,applicationArguments,banner等组件与上下文关联。
    在这里插入图片描述
  • refreshContext()刷新上下文,IOC容器的最后一道工序。
    在这里插入图片描述
    最后还有一个是事件的发布,这就是最简单的启动流程了!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot启动时做了哪些工作(同花顺面试篇) 的相关文章

随机推荐

  • ESB产品Oracle数据库升级说明

    ESB企业服务总线平台作为支撑企业综合集成的产品 在应用集成 数据集成 数据治理等解决方案都发挥着非常重要的作用 随着产品和解决方案的不断优化和升级 ESB企业服务总线平台功能需要逐步进行完善 不断提升产品功能的完备性 易用性和全面性 为了
  • 类和对象

    面向对象 类和对象 数据存储方面 变量 只能存储一个 如果内容多了 存储起来需要定义n个变量 麻烦 数组 可以存储一组相同数据类型的数据 数据类型相同 如果用数组存储一个人的信息 比较丰富的信息的话 不太方便 例如 吃货联盟中存储订单和菜品
  • Flowable-ui-modeler和MybatisPlus冲突问题

    启动出现报错 file F code test flowable boot target classes com example flowableboot flowable mapper ProcessModelMapper class r
  • 目录功能详解

    bin usr bin usr local bin 是Binary的缩写 这个目录存放着最经常使用的命令 sbin usr sbin usr local sbin s就是Super User的意思 这里存放的是系统管理员使用的系统管理程序
  • SpringBoot配置多个Redis集群数据源+自定义缓存注解实例

    今天找了半天没找到线程的 网上都是多个Redis示例 最还还是自己想办法实现了 两个Redis集群作为数据源 自定义缓存注解 不会做的是否发现好tm难 都不知道怎么动手 做完之后 发现原理其实特别简单 很容易就能实现 分两部分原理和示例代码
  • 使用pycharm传入初始化环境配置参数(Run configuration)

    在run gt edit configurations 选择项目并填写参数
  • td 字典表_字典表设计

    为什么字典表 存在问题 某些变量在多个地方使用 而且一般是固定的 但是随着系统升级和后期变化 可能需要改变 如果这些变量写死在代码里面将会变得难以维护 所以要将其从代码中抽离出来 一般的业务系统客户端与用户交互的时候都会使用下拉框组件 对于
  • day2作业

    1 列举出3种常见的操作系统 答 操作系统 windows ubuntu MacOS 其内核 windowsNT Linux uniux 2 简述Ubuntu和Linux的关系 答 Ubuntu 乌班图 是一个以桌面应用为主的Linux操作
  • 数据结构C语言版——初始化一个线性表

    问题描述 初始化一个线性表 程序代码 include stdio h include stdlib h define OVERFLOW 0 define OK 1 define LIST INIT SIZE 100 define LISTI
  • bomblab实验-bomb1~6and隐藏关

    bomb1 08048ae0
  • Spring之Bean的生命周期

    文章目录 BeanFactory 中 Bean的生命周期 测试代码 结论 ApplicationContext中 Bean的生命周期 BeanFactory 中 Bean的生命周期 带 的表示为容需要实现的接口 不带星号的表示是bean要实
  • Python 第10章课后习题参考答案

    第10章课后习题参考答案 一 单项选择题 以下关于Python内置库 标准库和第三方库的描述 正确的是 A 第三方库需要单独安装才能使用 B 内置库里的函数不需要 import 就可以调用 C 第三方库有三种安装方式 最常用的是 pip 工
  • 【IntellJ IDEA】idea上所有代码都报错了

    可能会碰到蓝屏 内存溢出重启idea等特殊情况 重新打开idea后发现原本的代码全都报错了 正确的解决方法 方法很简单 执行idea工具栏上下面的菜单 File gt Invalidate Caches Restart 重置下缓存就可解决该
  • Samba服务的介绍,安装和使用

    一 samba概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 SMB Server Messages Block 信息服务块 是一种在局域网上共享文件和打印机的一种通信协议 SMB协议是
  • (二)Qt实现自定义控件的两种方式---插件法

    系列文章目录 一 Qt实现自定义控件的两种方式 提升法 二 Qt实现自定义控件的两种方式 插件法 文章目录 系列文章目录 前言 一 Qt自定义控件的制作 完整代码 二 QtCreator使用DLL文件 问题解决 总结 前言 上一篇文章提到了
  • Cordic角度旋转算法高位宽输入实现DDS的一些思考

    Cordic角度旋转算法简介 在DDS内 Cordic算法相当于替代Rom的一种相幅映射算法 算法通过计算单位圆上点的X坐标和Y坐标 得到角度 的正弦和余弦值 从一个正弦和余弦已知的初始角度开始 通过多次旋转一系列固定角度来获得所需点的坐标
  • 计算机视觉论文精度大纲

    念念不忘 必有回响 目录 一 图像分类 1 AlexNet 2 VGGNet 3 GoogleNet v1 4 GoogleNet v2 B 5 GoogleNet v3 6 ResNet 二 目标检测 1 YOLOv1 2 YOLOv2
  • paramType

    paramType paramType 表示参数放在哪个地方 header gt 请求参数的获取 RequestHeader 代码中接收注解 query gt 请求参数的获取 RequestParam 代码中接收注解 path 用于rest
  • java对象的比较

    上一章中关于PriorityQueue的使用要注意 1 PriorityQueue中放置的元素必须要能够比较大小 不能插入无法比较大小的对象 否则会抛出 ClassCastException异常 2 不能插入null对象 否则会抛出Null
  • SpringBoot启动时做了哪些工作(同花顺面试篇)

    在北漂了几个月后 拿到了几个还行的offer 然后跑来了心心念念的杭州 讲实话 杭州各方面我还是比较有好感的 如果非要说一点不好的 那一定是 杭州太不尊重冬天了 你品 你细品 鄙人目前虽然是在摄像头大厂混吃混喝 但是面对她的主动邀请 同花顺