Java面试--SpringBoot启动流程

这篇具有很好参考价值的文章主要介绍了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的启动经过了一些一系列的处理,我们先看看整体过程的流程图

Java面试--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 (响应式编程);
Java面试--SpringBoot启动流程
具体代码文章来源地址https://www.toymoban.com/news/detail-428301.html

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

到了这里,关于Java面试--SpringBoot启动流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot启动流程简要

    SpringBoot启动流程大概: 初始化SpringApplication 根据项目的配置情况和Conditional条件来推断是否是一个Web应用。 读取所有jar包下面spring.factories文件,解析放入缓存,然后读取 ApplicationListener 为key的监听器,后续在SpringBoot加载的过程中会基于事件发布来做很多扩展通知。 真正的

    2024年02月15日
    浏览(40)
  • SpringBoot 启动流程

    概述 SpringBoot 是一个基于 Spring 的框架,它通过自动配置和约定大于配置的方式,简化了 Spring 应用程序的开发和部署。在本文中,我们将会深入了解 Spring Boot 的启动流程,掌握 Spring Boot 应用程序是如何启动并初始化的。 构建环境 在了解 Spring Boot 的启动流程之前,需要先理

    2024年02月06日
    浏览(47)
  • SpringBoot启动流程

    SpringBoot的启动都需要如下的启动类 分析启动类, 可以看出核心是: 注解@SpringBootApplication 方法SpringApplication.run(SpringBootDemoApplication.class, args) 其中@SpringBootApplication之前已经了解过,如果想要了解可以查看SpringBoot自动装配原理及分析 首先new了一个SpringApplication对象 然后调用Spr

    2024年01月25日
    浏览(42)
  • SpringBoot 的启动流程

    一、 生成SpringApplication对象 1. webApplicationType = 推测web应用的类型(NODE(普通项目)、SERVLET(Servlet web项目)、 * REACTIVE(响应式项目 flux) 2. 从spring.factories 中获取BootstrapRegistryInitializer对象 3. initializers = 从spring.factories中获取ApplicationContextInitializer对象 4. isteners = 从spring.factories中获取

    2024年02月13日
    浏览(36)
  • SpringBoot内嵌Tomcat启动流程

    Spring MVC 让开发者不用了解 Servlet 细节,专注于 Controller 编写 API 接口。Spring Boot 更是采用约定大于配置的设计思想,通过内嵌 Tomcat 的方式让开发者可以快速构建并部署一个 Web 应用。怎么做到的呢? 早期的开发,一般是基于 Spring 和 Spring MVC 构建我们的应用,然后把项目打

    2024年02月02日
    浏览(43)
  • springboot启动流程 (3) 自动装配

    在SpringBoot中,EnableAutoConfiguration注解用于开启自动装配功能。 本文将详细分析该注解的工作流程。 启用SpringBoot自动装配功能,尝试猜测和配置可能需要的组件Bean。 自动装配类通常是根据类路径和定义的Bean来应用的。例如,如果类路径上有tomcat-embedded.jar,那么可能需要一个

    2024年02月09日
    浏览(47)
  • springboot启动流程 (2) 组件扫描

    SpringBoot的组件扫描是基于Spring @ComponentScan注解实现的,该注解使用basePackages和basePackageClasses配置扫描的包,如果未配置这两个参数,Spring将扫描该配置类所属包下面的组件。 在服务启动时,将使用ConfigurationClassPostProcessor扫描当前所有的BeanDefinition,解析Configuration类,如果

    2024年02月09日
    浏览(44)
  • SpringBoot的启动流程源码分析

    new 一个IOC容器,传入配置好的文件xml,在这个地方打bug 在这个debug的栈帧中,下面几个不用看,直接看到getBean 内容如图所示,name传的就是我们在xml的bean标签的id,这里是instanceA 进入到doGetBean后,因为我是从IOC初始化容器debug进来的所以第一次通过。 Object sharedInstance = getSingl

    2024年01月24日
    浏览(47)
  • SpringBoot启动流程及自动配置

    SpringBoot启动流程源码: 1、启动SpringBoot启动类SpringbootdemoApplication中的main方法。 2、调用SpringApplication.run(SpringbootdemoApplication.class, args),该方法是一个静态方法。 3、继续调用SpringApplication内部的run方法 ,且构建了一个SpringApplication对象,应用程序将从指定的主要来源加载Bea

    2024年02月14日
    浏览(43)
  • SpringBoot源码学习4——SpringBoot内嵌Tomcat启动流程源码分析

    系列文章目录和关于我 我在初学spring的时候,很懵逼,因为整个项目中不存在main方法,让我有点摸不着头脑。那时候我知道有个东西叫tomcat是它监听了端口,解析了协议调到了我的servlet。 在我初学SpringBoot的时候,很懵逼,有main方法了,但是tomcat在哪里呢,又是如何启动起

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包