Spring Boot的啟動(dòng)原理是通過(guò)SpringApplication類來(lái)實(shí)現(xiàn)的。具體流程如下:
【資料圖】
創(chuàng)建一個(gè)應(yīng)用程序的SpringApplication實(shí)例。
分析應(yīng)用程序的上下文環(huán)境(包括Java系統(tǒng)屬性、環(huán)境變量、命令行參數(shù)等),并將其轉(zhuǎn)化為一個(gè)可配置的ApplicationContextInitializer列表。
創(chuàng)建一個(gè)可配置的Environment實(shí)例,并且將其作為參數(shù)傳遞給創(chuàng)建的ApplicationContextInitializer列表中的每個(gè)實(shí)例進(jìn)行初始化。
創(chuàng)建一個(gè)可配置的ResourceLoader實(shí)例,并將其傳遞給創(chuàng)建的ApplicationContextInitializer列表中的每個(gè)實(shí)例進(jìn)行初始化。
調(diào)用ApplicationContextInitializer列表中每個(gè)實(shí)例的initialize方法,對(duì)應(yīng)用程序的上下文環(huán)境進(jìn)行初始化。
創(chuàng)建一個(gè)可配置的BeanDefinitionRegistry實(shí)例,并將其傳遞給創(chuàng)建的ApplicationContextInitializer列表中的每個(gè)實(shí)例進(jìn)行初始化。
創(chuàng)建一個(gè)可配置的ApplicationContext實(shí)例,并且將其作為參數(shù)傳遞給創(chuàng)建的ApplicationContextInitializer列表中的每個(gè)實(shí)例進(jìn)行初始化。
調(diào)用ApplicationContextInitializer列表中每個(gè)實(shí)例的initialize方法,對(duì)ApplicationContext進(jìn)行初始化。
注冊(cè)應(yīng)用程序的主類(如果存在)作為一個(gè)bean,并調(diào)用其run方法來(lái)啟動(dòng)應(yīng)用程序。
如果應(yīng)用程序的主類是一個(gè)ServletInitializer(用于Web應(yīng)用程序),則通過(guò)調(diào)用其onStartup方法來(lái)啟動(dòng)Web容器。
使用Spring的DispatcherServlet來(lái)處理HTTP請(qǐng)求。
如果應(yīng)用程序的主類實(shí)現(xiàn)了CommandLineRunner接口,則調(diào)用其run方法,以便在應(yīng)用程序啟動(dòng)后執(zhí)行一些額外的邏輯。
Spring Boot的啟動(dòng)原理是通過(guò)創(chuàng)建SpringApplication實(shí)例來(lái)分析應(yīng)用程序的上下文環(huán)境并初始化ApplicationContext,然后通過(guò)調(diào)用應(yīng)用程序的主類來(lái)啟動(dòng)應(yīng)用程序,同時(shí)處理Web請(qǐng)求和執(zhí)行一些額外的邏輯。
標(biāo)簽: