日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

springboot源碼怎么看 springboot源碼深度解析

??前面給大家介紹了SpringBoot啟動(dòng)的核心流程,本文開(kāi)始給大家詳細(xì)的來(lái)介紹SpringBoot啟動(dòng)中的具體實(shí)現(xiàn)的相關(guān)細(xì)節(jié) 。
在看整體的實(shí)現(xiàn)邏輯之前,我們先分別看兩個(gè)內(nèi)容,第一就是在上面的代碼中使用到了相關(guān)的靜態(tài)變量 。

springboot源碼怎么看 springboot源碼深度解析


image.png
??這些靜態(tài)變量其實(shí)就是一些綁定的Java類(lèi)的全類(lèi)路徑 。第二個(gè)就是 ClassUtils.isPresent()方法,該方法的邏輯也非常簡(jiǎn)單,就是通過(guò)反射的方式獲取對(duì)應(yīng)的類(lèi)型的Class對(duì)象,如果存在返回true,否則返回false
springboot源碼怎么看 springboot源碼深度解析


image.png
??所以到此推導(dǎo)的邏輯就非常清楚了
springboot源碼怎么看 springboot源碼深度解析


image.png
2.setInitializers??然后我們?cè)賮?lái)看下如何實(shí)現(xiàn)加載初始化器的 。
1// 加載配置在spring.factories文件中的ApplicationContextInitializer對(duì)應(yīng)的類(lèi)型并實(shí)例化
2 // 并將加載的數(shù)據(jù)存儲(chǔ)在了 initializers 成員變量中 。
3 setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));

??首先所有的初始化器都實(shí)現(xiàn)了
ApplicationContextInitializer接口,也就是根據(jù)這個(gè)類(lèi)型來(lái)加載相關(guān)的實(shí)現(xiàn)類(lèi) 。
springboot源碼怎么看 springboot源碼深度解析


?然后加載的關(guān)鍵方法是
getSpringFactoriesInstances()方法 。該方法會(huì)加載 spring.factories文件中的key為
org.springframework.context.ApplicationContextInitializer 的值 。
spring-boot項(xiàng)目下
1# Application Context Initializers
2org.springframework.context.ApplicationContextInitializer=
3org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,
4org.springframework.boot.context.ContextIdApplicationContextInitializer,
5org.springframework.boot.context.config.DelegatingApplicationContextInitializer,
6org.springframework.boot.rsocket.context.RSocketPortInfoApplicationContextInitializer,
7org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer

spring-boot-autoconfigure項(xiàng)目下
1# Initializers
2org.springframework.context.ApplicationContextInitializer=
3org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,
4org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

springboot源碼怎么看 springboot源碼深度解析


image.png
具體的加載方法為 `getSpringFacotiesInstance()`方法,我們進(jìn)入查看??先進(jìn)入
SpringFactoriesLoader.loadFactoryNames(type, classLoader)中具體查看加載文件的過(guò)程.
springboot源碼怎么看 springboot源碼深度解析


image.png
【springboot源碼怎么看 springboot源碼深度解析】??然后我們來(lái)看下 loadSpringFactories方法
springboot源碼怎么看 springboot源碼深度解析


image.png
??通過(guò)Debug的方式查看會(huì)更清楚哦
springboot源碼怎么看 springboot源碼深度解析


image.png
??通過(guò) loadSpringFactories 方法我們看到把 spring.factories文件中的所有信息都加載到了內(nèi)存中了,但是我們現(xiàn)在只需要加載
ApplicationContextInitializer類(lèi)型的數(shù)據(jù) 。這時(shí)我們?cè)偻ㄟ^(guò) getOrDefault()方法來(lái)查看 。
springboot源碼怎么看 springboot源碼深度解析


image.png
??進(jìn)入方法中查看
springboot源碼怎么看 springboot源碼深度解析


image.png
??然后會(huì)根據(jù)反射獲取對(duì)應(yīng)的實(shí)例對(duì)象 。

推薦閱讀