一、SpringBoot是什么
SpringBoot 是依賴于 Spring 的,比起 Spring,除了擁有 Spring 的全部功能以外,SpringBoot 無需繁瑣的 Xml 配置,這取決于它自身強(qiáng)大的自動(dòng)裝配功能;并且自身已嵌入Tomcat、Jetty 等 web 容器,集成了 SpringMvc,使得 SpringBoot 可以直接運(yùn)行,不需要額外的容器,提供了一些大型項(xiàng)目中常見的非功能性特性,如嵌入式服務(wù)器、安全、指標(biāo),健康檢測(cè)、外部配置等,
其實(shí) Spring 大家都知道,Boot 是啟動(dòng)的意思。所以,Spring Boot 其實(shí)就是一個(gè)啟動(dòng) Spring 項(xiàng)目的一個(gè)工具而已,總而言之,SpringBoot 是一個(gè)服務(wù)于框架的框架;也可以說 SpringBoot 是一個(gè)工具,這個(gè)工具簡化了 Spring 的配置;
二、Spring Boot的核心功能
- 可獨(dú)立運(yùn)行的 Spring 項(xiàng)目:Spring Boot 可以以 Jar 包的形式獨(dú)立運(yùn)行
- 內(nèi)嵌的 Servlet 容器:Spring Boot 可以選擇內(nèi)嵌 Tomcat、Jetty 或者 Undertow,無須以 war 包形式部署項(xiàng)目
- 簡化的 Maven 配置:Spring 提供推薦的基礎(chǔ) POM 文件來簡化 Maven 配置
- 自動(dòng)配置 Spring:Spring Boot會(huì)根據(jù)項(xiàng)目依賴來自動(dòng)配置 Spring 框架,極大地減少項(xiàng)目要使用的配置
- 提供生產(chǎn)就緒型功能:提供可以直接在生產(chǎn)環(huán)境中使用的功能,如性能指標(biāo)、應(yīng)用信息和應(yīng)用健康檢查
- 無代碼生成和 Xml 配置:Spring Boot 不生成代碼。完全不需要任何 Xml 配置即可實(shí)現(xiàn) Spring 的所有配置
三、SpringBoot啟動(dòng)流程
SpringBoot的啟動(dòng)經(jīng)過了一些一系列的處理,我們先看看整體過程的流程圖
3.1、運(yùn)行 SpringApplication.run() 方法
可以肯定的是,所有的標(biāo)準(zhǔn)的 SpringBoot 的應(yīng)用程序都是從 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) {
// 啟動(dòng)springboot
ConfigurableApplicationContext run = SpringApplication.run(App.class, args);
}
}
進(jìn)入 run 方法后,會(huì) new 一個(gè) SpringApplication 對(duì)象,創(chuàng)建這個(gè)對(duì)象的構(gòu)造函數(shù)做了一些準(zhǔn)備工作,編號(hào)第 2~5 步就是構(gòu)造函數(shù)里面所做的事情文章來源:http://www.zghlxwxcb.cn/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、確定應(yīng)用程序類型
在 SpringApplication 的構(gòu)造方法內(nèi),首先會(huì)通過 WebApplicationType.deduceFromClasspath()
; 方法判斷當(dāng)前應(yīng)用程序的容器,默認(rèn)使用的是Servlet 容器,除了 Servlet 之外,還有 NONE 和 REACTIVE (響應(yīng)式編程);
具體代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-428301.html
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// resourceLoader 賦值為 Null
this.resourceLoader = resourceLoader;
// primarySources不為空,繼續(xù)向下執(zhí)行。為空拋異常
Assert.notNull(primarySources, "PrimarySources must not be null");
// 將 SpringbootdemoApplication(啟動(dòng)類)賦值給 primarySources
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 從 classpath 類路徑推斷 Web 應(yīng)用類型,有三種 Web 應(yīng)用類型,分別是
// NONE: 該應(yīng)用程序不應(yīng)作為 Web 應(yīng)用程序運(yùn)行,也不應(yīng)啟動(dòng)嵌入式 Web 服務(wù)器
// SERVLET: 該應(yīng)用程序應(yīng)作為基于 servlet 的 Web 應(yīng)用程序運(yùn)行,并應(yīng)啟動(dòng)嵌入式 servlet Web 服務(wù)器。
// REACTIVE: 該應(yīng)用程序應(yīng)作為響應(yīng)式 Web 應(yīng)用程序運(yùn)行,并應(yīng)啟動(dòng)嵌入式響應(yīng)式 Web 服務(wù)器
this.webApplicationType = WebApplicationType.deduceFromClasspath();
// 初始化 bootstrapRegistryInitializers,通過 getSpringFactoriesInstances()獲取工廠實(shí)例,
// 底層使用的是反射Class<?> instanceClass = ClassUtils.forName(name, classLoader)動(dòng)態(tài)加載實(shí)例對(duì)象。
this
到了這里,關(guān)于Java面試--SpringBoot啟動(dòng)流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!