Skip to content

Latest commit

 

History

History
77 lines (45 loc) · 4.21 KB

File metadata and controls

77 lines (45 loc) · 4.21 KB

11.Spring Boot

这里我找了一些个人感觉容易问到的面试题

什么是 Spring Boot?

Spring Boot是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能。

通过 Spring Boot ,我们开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。

Spring Boot启动流程

  1. 启动类里面调用SpringApplication.run方法

  2. 在run方法中,首先构造SpringApplication对象,然后再调用run方法

  3. 在构造SpringApplication对象中,做了如下工作

    • 将sources放入primarySources变量中
    • 判断webApplication是什么类型的
    • 设置ApplicationContextInitializer,ApplicationListener,通过加载META-INF/spring.factories中配置的类
    • 找到main方法找到启动主类
  4. run方法中,做的工作

    • StopWatch主要是监控启动过程,统计启动时间,检测应用是否已经启动或者停止。
    • 加载SpringApplicationRunListener(也是通过META-INF/spring.factories),默认加载的是EventPublishingRunListener
    • 调用RunListener.starting()方法。
    • 根据args创建应用参数解析器ApplicationArguments;
    • 准备环境变量:获取环境变量environment,将应用参数放入到环境变量持有对象中,监听器监听环境变量对象的变化(listener.environmentPrepared)
    • 打印Banner信息(SpringBootBanner)
    • 创建SpringBoot的应用上下文(AnnotationConfigEmbeddedWebApplicationContext)
    • prepareContext上下文之前的准备
    • refreshContext刷新上下文
    • afterRefresh(ApplicationRunner,CommandLineRunner接口实现类的启动)
    • 返回上下文对象

基于SB3.x的启动流程图:

img

Spring Boot启动的时候会加载哪些包?

在web项目中,会在Maven中配置 spring-boot-starter-web 包,该包中包含了spring-core、spring-content、servlet、tomcat、jackson、HikariCP、junit、jdbc、slf4j 等

Spring Boot 的监听器

Spring Boot 的监听器指的是SpringApplicationRunListener和ApplicationListener

SpringApplicationRunListener 是Spring Boot 定义的监听器,用于监听 SpringApplication 的启动过程,并在启动的不同阶段执行自定义逻辑(只在启动阶段)。它允许开发者在应用启动的各个生命周期节点插入自己的代码,例如初始化资源、记录日志、监控启动过程等,通过META-INF/spring.factories 文件配置注册。

ApplicationListener是Spring 定义的监听器,能够监听 Spring 容器内发布的 ApplicationEvent 事件,覆盖应用的全生命周期,通过作为 Spring Bean 注册(如 @Component)、META-INF/spring.factories(org.springframework.context.ApplicationListener)、SpringApplication的addListener和配置文件context.istener.classes

如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?

  • 【推荐】spring-boot-devtools 插件。注意,这个工具需要配置 IDEA 的自动编译。

  • Spring Loaded 插件。

    Spring Boot 2.X 后,官方宣布不再支持 Spring Loaded 插件 的更新,所以基本可以无视它了。

  • JRebel 插件,需要付费。

  • 使用插件化开发,插件化代码使用手动注册Bean的方式

关于如何使用 spring-boot-devtools 和 Spring Loaded 插件,可以看看 《Spring Boot 学习笔记:Spring Boot Developer Tools 与热部署》

什么是 Spring Boot 自动配置?

  1. Spring Boot 在启动时扫描项目所依赖的 jar 包,寻找包含spring.factories 文件的 jar 包。
  2. 根据 spring.factories 配置加载 AutoConfigure 类。(Spring Boot 2.7 以后,从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中加载配置的Jar包)
  3. 根据 @Conditional 等条件注解的条件,进行自动配置并将 Bean 注入 Spring IoC 中。

详细介绍:https://itsaysay.blog.csdn.net/article/details/131736129