Java面试--SpringBoot启动流程

一、SpringBoot是什么

SpringBoot 是依赖于 Spring 的,比起 Spring,除了拥有 Spring 的全部功能以外,SpringBoot 无需繁琐的 Xml 配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty 等 web 容器,集成了 SpringMvc,使得 SpringBoot 可以直接运行,不需要额外的容器,提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等,

其实 Spring 大家都知道,Boot 是启动的意思。所以,Spring Boot 其实就是一个启动 Spring 项目的一个工具而已,总而言之,SpringBoot 是一个服务于框架的框架;也可以说 SpringBoot 是一个工具,这个工具简化了 Spring 的配置;

二、Spring Boot的核心功能

  1. 可独立运行的 Spring 项目:Spring Boot 可以以 Jar 包的形式独立运行
  2. 内嵌的 Servlet 容器:Spring Boot 可以选择内嵌 Tomcat、Jetty 或者 Undertow,无须以 war 包形式部署项目
  3. 简化的 Maven 配置:Spring 提供推荐的基础 POM 文件来简化 Maven 配置
  4. 自动配置 Spring:Spring Boot会根据项目依赖来自动配置 Spring 框架,极大地减少项目要使用的配置
  5. 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查
  6. 无代码生成和 Xml 配置:Spring Boot 不生成代码。完全不需要任何 Xml 配置即可实现 Spring 的所有配置

三、SpringBoot启动流程

SpringBoot的启动经过了一些一系列的处理,我们先看看整体过程的流程图

在这里插入图片描述

3.1、运行 SpringApplication.run() 方法

可以肯定的是,所有的标准的 SpringBoot 的应用程序都是从 run 方法开始的

package com.spring;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
@SpringBootApplication
public class App  {
   
   
    public static void main(String[] args) {
   
   
        // 启动springboot
        ConfigurableApplicationContext run = SpringApplication.run(App.class, args);
    }
}

进入 run 方法后,会 new 一个 SpringApplication 对象,创建这个对象的构造函数做了一些准备工作,编号第 2~5 步就是构造函数里面所做的事情

/**
 * Static helper that can be used to run a {@link SpringApplication} from the
 * specified sources using default settings and user supplied arguments.
 * @param primarySources the primary sources to load
 * @param args the application arguments (usually passed from a Java main method)
 * @return the running {@link ApplicationContext}
 */
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
		String[] args) {
   
   
	return new SpringApplication(primarySources).run(args);
}

3.2、确定应用程序类型

在 SpringApplication 的构造方法内,首先会通过 WebApplicationType.deduceFromClasspath(); 方法判断当前应用程序的容器,默认使用的是Servlet 容器,除了 Servlet 之外,还有 NONE 和 REACTIVE (响应式编程);
在这里插入图片描述
具体代码

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
   
   
   // resourceLoader 赋值为 Null
   this.resourceLoader = resourceLoader;
   
   // primarySources不为空,继续向下执行。为空抛异常
   Assert.notNull(primarySources, "PrimarySources must not be null");
   
   // 将 SpringbootdemoApplication(启动类)赋值给 primarySources 
   this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
   
   // 从 classpath 类路径推断 Web 应用类型,有三种 Web 应用类型,分别是
   // NONE: 该应用程序不应作为 Web 应用程序运行,也不应启动嵌入式 Web 服务器
   // SERVLET: 该应用程序应作为基于 servlet 的 Web 应用程序运行,并应启动嵌入式 servlet Web 服务器。
   // REACTIVE: 该应用程序应作为响应式 Web 应用程序运行,并应启动嵌入式响应式 Web 服务器
   this.webApplicationType = WebApplicationType.deduceFromClasspath();
   
   // 初始化 bootstrapRegistryInitializers,通过 getSpringFactoriesInstances()获取工厂实例,
   // 底层使用的是反射Class<?> instanceClass = ClassUtils.forName(name, classLoader)动态加载实例对象。
   this.bootstrapRegistryInitializers = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极星小王子

你的鼓励是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值