最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot啟動之SpringApplication初始化詳解

 更新時間:2024年01月02日 08:32:20   作者:my_sky_  
這篇文章主要介紹了SpringBoot啟動之SpringApplication初始化詳解,首先初始化資源加載器,默認為null;斷言判斷主要資源類不能為null,否則報錯,需要的朋友可以參考下

SpringApplication初始化

在這里插入圖片描述

當啟動SpringBoot應(yīng)用后,經(jīng)過兩步,會進入到new SpringApplication(primarySources).run(args)。

1、primarySources參數(shù)

primarySources參數(shù)實際為Spring Boot應(yīng)用上下文的Configuration Class,在后面掃描配置類時起作用。

2、SpringApplication初始化

SpringApplication對象的初始化

在這里插入圖片描述

具體操作包括:

  • 首先初始化資源加載器,默認為null;斷言判斷主要資源類不能為null,否者報錯。
  • 然后將主資源類primarySources存儲到SpringApplication對象Set類型的primarySources屬性中。
  • 推斷當前 WEB 應(yīng)用類型,一共有三種:NONE,SERVLET,REACTIVE;默認是SERVLET。
  • 加載Spring應(yīng)用上下文初始化器:從"META-INF/spring.factories"文件中讀取ApplicationContextInitializer類的實例名稱集合,然后進行Set去重、利用反射實例化對象,最后按照Order排序后,賦值到SpringApplication的List類型的initializers屬性上,一共7個。
  • 加載Spring應(yīng)用事件監(jiān)聽器:從"META-INF/spring.factories"文件中讀取ApplicationListener類的實例名稱集合,然后進行Set去重、利用反射實例化對象,最后按照Order排序后,賦值到SpringApplication的List類型的listeners屬性上,一共11個。
  • 推斷主入口應(yīng)用類:通過當前調(diào)用棧的解析,獲取Main方法所在類,并賦值給SpringApplication的mainApplicationClass屬性。

1)推斷Web應(yīng)用類型

this.webApplicationType = WebApplicationType.deduceFromClasspath();

這里推斷的Web應(yīng)用類型是默認的,我們還可以手動的再通過setWebApplicatioinType(WebApplicationType)方法進行調(diào)整。這里通過檢查當前ClassLoader下基準Class的存在性來推斷Web應(yīng)用類型。

public enum WebApplicationType {
	NONE,
	SERVLET,
	REACTIVE;
	private static final String[] SERVLET_INDICATOR_CLASSES = { "javax.servlet.Servlet",
			"org.springframework.web.context.ConfigurableWebApplicationContext" };
	private static final String WEBMVC_INDICATOR_CLASS = "org.springframework.web.servlet.DispatcherServlet";
	private static final String WEBFLUX_INDICATOR_CLASS = "org.springframework.web.reactive.DispatcherHandler";
	private static final String JERSEY_INDICATOR_CLASS = "org.glassfish.jersey.servlet.ServletContainer";
    ....
	static WebApplicationType deduceFromClasspath() {
		// 1. 如果`DispatcherHandler`存在,并且`DispatcherServlet`和`ServletContainer`不存在時,Web應(yīng)用類型為REACTIVE;
		if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
				&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
			return WebApplicationType.REACTIVE;
		}
		// 2. 如果`Servlet`和`ConfigurableWebApplicationContext`不存在,則當前應(yīng)用為非Web引應(yīng)用,即NONE。
		for (String className : SERVLET_INDICATOR_CLASSES) {
			if (!ClassUtils.isPresent(className, null)) {
				return WebApplicationType.NONE;
			}
		}
		// 3.當Spring WebFlux和Spring Web MVC同時存在時,Web應(yīng)用依舊是SERVLET。
		return WebApplicationType.SERVLET;
	}
    ....
}

WEB 應(yīng)用類型,一共有三種:NONE,SERVLET,REACTIVE。

deduceFromClasspath()方法利用ClassUtils.isPresent(String, ClassLoader)方法依次判斷reactive.DispatcherHandler、ConfigurableWebApplicationContext、Servlet、servlet.DispatcherServlet的存在性組合情況,從而判斷Web 引用類型,具體邏輯如下:

  • 如果DispatcherHandler存在,并且DispatcherServlet和ServletContainer不存在時,即:Spring Boot僅依賴WebFlux時,Web應(yīng)用類型為REACTIVE;
  • 如果Servlet和ConfigurableWebApplicationContext不存在,則當前應(yīng)用為非Web應(yīng)用,即NONE。因為這兩個API是Spring Web MVC必須的依賴。
  • 當Spring WebFlux和Spring Web MVC同時存在時,Web應(yīng)用類型依舊是SERVLET。

2)加載Spring應(yīng)用上下文初始化器ApplicationContextInitializer

setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));

這個過程包括兩個動作:

1. getSpringFactoriesInstances(ApplicationContextInitializer.class)從"META-INF/spring.factories"文件中讀取ApplicationContextInitializer類的實例名稱集合,然后進行Set去重、利用反射實例化對象,最后按照Order排序。

2. setInitializers(Collection)將Collection賦值到SpringApplication的List類型的initializers屬性上,一共7個。

3)加載Spring事件應(yīng)用監(jiān)聽器ApplicationListener

setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

這個過程和加載Spring應(yīng)用上下文初始化器ApplicationContextInitializer一樣(區(qū)別在于這里不再直接從spring.factories文件中獲取內(nèi)容,而是走cache(MultiValueMap<String, String>)緩存)。

4)推斷應(yīng)用引導類

this.mainApplicationClass = deduceMainApplicationClass();
private Class<?> deduceMainApplicationClass() {
	try {
		StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
		for (StackTraceElement stackTraceElement : stackTrace) {
			if ("main".equals(stackTraceElement.getMethodName())) {
				return Class.forName(stackTraceElement.getClassName());
			}
		}
	}
	catch (ClassNotFoundException ex) {
	}
	return null;
}

該方法根據(jù)當前線程執(zhí)行棧來判斷其棧中哪個類包含main方法,然后將找到的類名通過反射返回Class對象。

至此,在SpringApplication構(gòu)造過程中,SpringApplication屬性primarySources、webApplicationType、initializers、listeners 和 mainApplicationClass都被初始化了。

到此這篇關(guān)于SpringBoot啟動之SpringApplication初始化詳解的文章就介紹到這了,更多相關(guān)SpringApplication初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用SpringBoot+OkHttp+fastjson實現(xiàn)Github的OAuth第三方登錄

    使用SpringBoot+OkHttp+fastjson實現(xiàn)Github的OAuth第三方登錄

    這篇文章主要介紹了使用SpringBoot+OkHttp+fastjson實現(xiàn)Github的OAuth第三方登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • SpringBoot使用前綴樹過濾敏感詞的方法實例

    SpringBoot使用前綴樹過濾敏感詞的方法實例

    Trie也叫做字典樹、前綴樹(Prefix Tree)、單詞查找樹,特點:查找效率高,消耗內(nèi)存大,這篇文章主要給大家介紹了關(guān)于SpringBoot使用前綴樹過濾敏感詞的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Netty通道的容器屬性Attribute詳解

    Netty通道的容器屬性Attribute詳解

    這篇文章主要介紹了Netty通道的容器屬性Attribute詳解,Netty中的Channel通道類,有類似于Map的容器功能,可以通過鍵值對的形式來保存任何Java Object的值,一般來說可以存放一些與通道實例相關(guān)聯(lián)的屬性,比如說服務(wù)期端的ServerSession會話實例,需要的朋友可以參考下
    2023-12-12
  • MyBatis參數(shù)綁定中參數(shù)名不一致導致的錯誤問題解決方法

    MyBatis參數(shù)綁定中參數(shù)名不一致導致的錯誤問題解決方法

    作為一名Java開發(fā)者,我在實際項目中曾多次遇到MyBatis參數(shù)綁定的問題,其中最常見的一種情況是MyBatis參數(shù)綁定中參數(shù)名不一致導致的錯誤,這類問題看似簡單,但若不深入理解MyBatis的參數(shù)綁定機制,極易陷入誤區(qū),本文將帶大家一起探討解決方案,需要的朋友可以參考下
    2025-06-06
  • Java實現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法

    Java實現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法

    這篇文章主要介紹了Java實現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,每一個鏈表都包含多個節(jié)點,節(jié)點又包含兩個部分,一個是數(shù)據(jù)域(儲存節(jié)點含有的信息),一個是引用域(儲存下一個節(jié)點或者上一個節(jié)點的地址),需要的朋友可以參考下
    2022-01-01
  • java.sql.SQLException:?connection?holder?is?null錯誤解決辦法

    java.sql.SQLException:?connection?holder?is?null錯誤解決辦法

    這篇文章主要給大家介紹了關(guān)于java.sql.SQLException:?connection?holder?is?null錯誤的解決辦法,這個錯誤通常是由于連接對象為空或未正確初始化導致的,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • SpringBoot + Maven 多環(huán)境打包實現(xiàn)方法

    SpringBoot + Maven 多環(huán)境打包實現(xiàn)方法

    本文介紹如何在SpringBoot項目中實現(xiàn)不同環(huán)境的配置切換及Maven多環(huán)境打包的方法,包括配置文件的選擇與加載機制,以及如何通過POM文件進行多環(huán)境打包,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器

    如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器

    最近工作中遇到了做一個管理員工信息的功能,下面這篇文章主要給大家介紹了關(guān)于如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • SpringCloud學習筆記之OpenFeign進行服務(wù)調(diào)用

    SpringCloud學習筆記之OpenFeign進行服務(wù)調(diào)用

    OpenFeign對feign進行進一步的封裝,添加了springmvc的一些功能,更加強大,下面這篇文章主要給大家介紹了關(guān)于SpringCloud學習筆記之OpenFeign進行服務(wù)調(diào)用的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Java中的CompletableFuture核心用法和常見場景

    Java中的CompletableFuture核心用法和常見場景

    CompletableFuture是Java8引入的強大的異步編程工具,支持鏈式異步編程、組合、異常處理和回調(diào),介紹其核心用法,通過實用示例和注意事項,展示了如何在實際場景中應(yīng)用CompletableFuture,以提高并發(fā)能力和響應(yīng)速度,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

九江市| 云浮市| 海盐县| 邻水| 榆树市| 永川市| 达孜县| 庐江县| 施甸县| 沁源县| 潢川县| 甘德县| 昌图县| 天全县| 余庆县| 宕昌县| 深州市| 张家口市| 株洲县| 阳谷县| 西充县| 长沙市| 潼南县| 新安县| 当涂县| 泰兴市| 沈阳市| 桃园市| 石阡县| 松阳县| 阜南县| 大厂| 永州市| 华安县| 安龙县| 沭阳县| 云龙县| 农安县| 大足县| 宁蒗| 丰宁|