一、SpringBoot是什么
SpringBoot 是依赖于 Spring 的,比起 Spring,除了拥有 Spring 的全部功能以外,SpringBoot 无需繁琐的 Xml 配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty 等 web 容器,集成了 SpringMvc,使得 SpringBoot 可以直接运行,不需要额外的容器,提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等,
其实 Spring 大家都知道,Boot 是启动的意思。所以,Spring Boot 其实就是一个启动 Spring 项目的一个工具而已,总而言之,SpringBoot 是一个服务于框架的框架;也可以说 SpringBoot 是一个工具,这个工具简化了 Spring 的配置;
二、Spring Boot的核心功能
- 可独立运行的 Spring 项目:Spring Boot 可以以 Jar 包的形式独立运行
- 内嵌的 Servlet 容器:Spring Boot 可以选择内嵌 Tomcat、Jetty 或者 Undertow,无须以 war 包形式部署项目
- 简化的 Maven 配置:Spring 提供推荐的基础 POM 文件来简化 Maven 配置
- 自动配置 Spring:Spring Boot会根据项目依赖来自动配置 Spring 框架,极大地减少项目要使用的配置
- 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查
- 无代码生成和 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 步就是构造函数里面所做的事情文章来源:https://www.toymoban.com/news/detail-428301.html
/**
* 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 (响应式编程);
具体代码文章来源地址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模板网!