springboot啟動類springApplication與注解解析

springboot的main方法3種啟動方式

第一種


image.png

第二種


image.png

image.png

可以看到tomcat的啟動端口為54155

第三種,使用bulider模式


image.png

@SpringBootApplication注解和springApplication.run方法運行main方法來啟動spring容器或者tomcat容器。那么springboot啟動的原理是什么?

以上三種方法都是使用springApplication類的run方法來啟動的

image

springApplication.run方法返回的是

ConfigurableApplicationContext接口,它是springframework的注解,啟動打印一下它的實現(xiàn)類的誰?

image

這個實現(xiàn)類是AnnotationConfigServletWebServerApplicationContext

用中式英文翻譯理解成是一個注解配置的ServletWeb的服務(wù)application上下文,就是使用注解配置的方式啟動web服務(wù)。


image

從run方法的源碼可以看出,是先創(chuàng)建一個ApplicationContext(剛才啟動得到是的

AnnotationConfigServletWebServerApplicationContext)

再進(jìn)行注冊和啟動容器上下文的

既然是通過這個類來實現(xiàn)啟動的,底層用的也是springframework注解的啟動方式,我們可以直接通過這個實現(xiàn)類來啟動web服務(wù)

image

進(jìn)行運行main方法,

image

啟動web容器成功。這個其實還需要依賴@SpringBootApplication里面的

@EnableAutoConfiguration注解,這個注解能將初始化web容器的類加載并注冊到spring容量中

為什么是實現(xiàn)類是一個ServletWeb的類?是因為我在maven依賴下加了springboot的web包,

image

WebApplicationType.deduceFromClasspath()方法里面

image

啟動只會判斷使用哪個容器,加了web包會使用默認(rèn)的tomcat容

image

所以啟動的就是web容器。

如果我把這個包去掉,或者用springboot的方法設(shè)置成不啟動web,只啟動spring容器,看看它是實現(xiàn)類是哪個?

image
image

AnnotationConfigApplicationContext類,這個spring的一個注解方式啟動的類,可以結(jié)合@ComponentScan和@Configuration注解來啟動spring IOC容器

使用注解方式啟動spring IOC容器的方式

image

我們創(chuàng)建一個Hello類,看看能不能通過getBean方式得到實例

image

啟動容器,看到日志打印了hello方法執(zhí)行的值,說明啟動spring容器成功

image

這種方式啟動spring與 new ClassPathXmlApplicationContext("..xml")類通過xml配置文件啟動spring的方式一樣。

我們來看看@SpringBootApplication注解
@SpringBootApplication

我們可以看到@SpringBootApplication主要由

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

三個注解組合。

那么這三個注解都做了什么?

@SpringBootConfiguration注解(spring boot的配置類)

標(biāo)注在某個類上,表示這是一個springboot的配置類
一層層點到最后,發(fā)現(xiàn)其實就是我們熟悉的spring的framework包下的注解@Configuartion
@Configuartion:配置類上用這個注冊-配置類的作用可以充當(dāng)配置文件,配置類也是容器中的一個組件;@Component

image

@Configuartion是@Component的派生注解,如果不熟識的話,我們可以看看官網(wǎng)解析

@Service、@Repository、@Configuartion等注解都是@Component的派生,可以理解成@Component是父類,@Configuartion是子類。

其實這些注解的作用都是,就是spring掃描類時會對加上這些注解的類自動裝配到Spring容器中進(jìn)行管理。只是注解分多個名稱來標(biāo)注,閱讀代碼時更好的理解代碼的作用,我們可以看看

ClassPathScanningCandidateComponentProvider類

image
image

掃描的就是@Component注解,和它派生出來的注解(子類注解)

與xml中配置<bean id="" class=""/>作用相同

@EnableAutoConfiguration注解,開啟自動配置功能

能夠激活spring spi,會讀取所有jar包下
META-INF/spring.factories文件的配置的類,在spring啟動時,Spring容器會對這些配置類進(jìn)行處理。(類似于java的spi) ,spring.factories所有類都會被spring加載(不管是否需要用到)并注冊到spring容器中,例如需要啟動web容器如tomcat時,就需要用到
ServletWebServerFactoryAutoConfiguration類,那么這個類就需要注冊到spring容器中進(jìn)行初始化,通過spring.factories掃描到這個類

image

并且激活自動裝配的以@Enable開頭注解 如:

@EnableAspectJAutoProxy

@EnableAsync

@ComponentScan注解

指定要掃描的包及其子包下的類,默認(rèn)掃描當(dāng)前類的同級包及其子包,作用:比如某個類上有@Component,還需要@ComponentScan注解來指定掃描這個包的類,spring才會去處理這個類上的注解
xml的<context:component-scan base-package="" />作用相同

springApplication.run方法主要是對META-INF/spring.factories的類進(jìn)行加載,加載spring的監(jiān)聽器。選擇容器并對容器初始化,進(jìn)行組件的掃描,加載和注冊,最后返回容器的上下文。

springboot選擇容器時有3種類型容器判斷

WebApplicationType.NONE : 非 Web 類型

WebApplicationType.REACTIVE : Spring WebFlux

WebApplicationType.SERVLET : Spring MVC(ServletWeb容器(tomcat jetty等))

springboot的注解基本都是對springframework注解的封裝,

@ComponentScan是指定要掃描的包

@SpringBootConfiguration是注解方式將bean注冊到spring容器到

@EnableAutoConfiguration可以理解成是激活spring spi,容器啟動過程,如果想要將bean注冊到spring容器中,必須要掃描到類的路徑,但是springboot默認(rèn)是掃描main方法的同及包,不會去掃描jar包,想要初始化jar包下的bean,就要用到這個spring spi機制,會讀取所有jar包下META-INF/spring.factories配置文件,并加載配置文件上的類,注冊到spring容器中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容