一般情況下克滴,springboot的啟動(dòng)時(shí)通過SpringApplication.run的漫蛔,但是他到底經(jīng)歷了什么呢蕉堰?
我們跟蹤到的第一個(gè)重要的方法旅掂。自己new了一個(gè)SpringApplicaton泽台,并且將參數(shù)傳遞給了run方法
我們先看一下SpringApplicaton初始化什荣,到底做了什么。其中關(guān)鍵的方法
this.webEnvironment 這個(gè)屬性存的是當(dāng)前環(huán)境是否是web的環(huán)境怀酷,通過類路徑上是否有"javax.servlet.Servlet",
"org.springframework.web.context.ConfigurableWebApplicationContext"這兩個(gè)類稻爬,有的話就是web環(huán)境,否則不是web環(huán)境蜕依。上面這段代碼的重點(diǎn)是getSpringFactoriesInstances方法
這個(gè)方法是獲取給定類型的實(shí)例桅锄。其中最為核心的是SpringFactoriesLoader.loadFactoryNames,根據(jù)類型獲取這個(gè)類型實(shí)現(xiàn)這個(gè)類型的類的全限定名稱样眠。隨后根據(jù)類名反射創(chuàng)建實(shí)例友瘤,然后排序。
FACTORIES_RESOURCE_LOCATION這個(gè)常量值為META-INF/spring.factories檐束,說了那么多辫秧,大boss出來了,就是項(xiàng)目路徑中META-INF文件夾中的spring.factories文件被丧。我們可以大體看一下這文件的結(jié)構(gòu)盟戏。例如:org\springframework\boot\spring-boot-autoconfigure\1.4.1.RELEASE\spring-boot-autoconfigure-1.4.1.RELEASE.jar!\META-INF\spring.factories
他的格式如上圖所示绪妹,其實(shí)是spring boot SPI 的擴(kuò)展方式,它的key就是類的全限定名柿究,value是實(shí)現(xiàn)了這個(gè)接口的實(shí)現(xiàn)類的全限定名邮旷。
總結(jié):SpringFactoriesLoader.loadFactoryNames通過傳遞過來的Type,獲取這個(gè)Type的全限定名蝇摸,隨后查詢項(xiàng)目路徑下的META-INF文件夾中的spring.factories文件加載成properties,根據(jù)key查詢value婶肩,將實(shí)現(xiàn)了這個(gè)Type的類的全限定名以List的形式返回出去進(jìn)行實(shí)例化。
到目前為止探入,初始化都已經(jīng)差不多了狡孔,現(xiàn)在咱們?cè)賮碚f一下這個(gè)run.
StopWatch 秒表記錄時(shí)間使用的懂诗,目的是打印啟動(dòng)話費(fèi)了多長時(shí)間的日志蜂嗽。getRunListeners是獲取SpringApplicationRunListener類型的實(shí)例(其實(shí)就是EventPublishingRunListener),獲取方式見上文getSpringFactoriesInstances方法殃恒,隨后啟動(dòng)監(jiān)聽器植旧,配置環(huán)境,打印Banner,創(chuàng)建Spring 容器离唐。填充spring容器病附。啟動(dòng)Spring 容器(與傳統(tǒng)Spring的切合點(diǎn)),在afterRefresh中調(diào)用容器中的
ApplicationRunner亥鬓,CommandLineRunner完沪,最后關(guān)閉監(jiān)聽器。
上面就是run進(jìn)行的操作嵌戈,簡(jiǎn)單的跟了一下覆积,大體的脈絡(luò)都已經(jīng)清晰了,下一篇見咯