小編帶着小白看springboot源碼7

上一節在springboot中配置了servlet三大組件以及嵌入式servlet容器,並且還簡單的說了如何切換不同的容器。

  這一節就來說說如何改變servlet容器的配置參數,一般有兩種常見的方式,第一種:配置文件(properties和yml);第二種:往容器裏添加組件的方式

  注意注意:我這裏說的容器和嵌入式容器不一樣的,容器指的是ioc容器,嵌入式servlet容器值得是servlet容器,不要混淆了

1.通過配置文件的方式配置

  yml爲例,下圖所示,這是配置容器啓動的端口
小編帶着小白看springboot源碼7
而且我們可以點開這個端口,可以發現
小編帶着小白看springboot源碼7
而這個ServerProperties的很多屬性,port,adress,serverPath等等都可以在配置文件中server.xxx=xxxxx進行修改。

 

在這個類中,起作用的主要是這個customize方法來設置容器的屬性
小編帶着小白看springboot源碼7
2.通過嵌入式servlet容器定製器設置(這種配置比上面優先級高)

  隨便找個配置類,如下代碼(也可以配置其他屬性,我用最簡單的port演示一下)
小編帶着小白看springboot源碼7
可以啓動容器,看控制檯,8082端口,啓動成功,而且覆蓋了yml配置的8080端口,這種方式的優先級更高。
小編帶着小白看springboot源碼7
3.一起來剖析原理(Tomcat爲例)

  我們可以發現這兩種的本質是一樣的,最終都是向容器裏添加一個嵌入式servlet容器定製器,執行其中的customize方法。

  那麼,我們從哪裏入手呢?(不用想,肯定是自動配置類啊,記住,一切配置入手都是從自動配置類開始)

  打開一個叫做EmbeddedServletContainerAutoConfiguration的類,翻譯就叫做嵌入式servlet容器自動配置。
小編帶着小白看springboot源碼7
重點是這個自動配置類裏面的配置(就以默認的tomcat爲例)
小編帶着小白看springboot源碼7
只要添加了tomcat的依賴,會爲ioc容器裏面添加Tomcat的嵌入式servlet容器工廠,打開這個容器工廠
小編帶着小白看springboot源碼7
小編帶着小白看springboot源碼7
點開這個類之後。我們主要看這裏
小編帶着小白看springboot源碼7
小編帶着小白看springboot源碼7
小編帶着小白看springboot源碼7
一直到這裏,tomcat的配置都過了一遍,總結一下啊:只要EmbeddedServletContainerAutoConfiguration這個配置類生效------->向ioc容器導入TomcatEmbeddedServletContainerFactory組件---------->這個tomcat嵌入式容器工廠裏面會創建正常Tomcat容器對象---------->然後進行封裝成嵌入式類型的容器,內部會直接啓動Tomcat,從這裏可以大概看出來先啓動的ioc容器,然後再是Tomcat容器

  是不是還忘記了前面說的,這個自動配置類要起作用,會提前在ioc容器中導入一個註冊器,這個組件很關鍵,他會在EmbeddedServletContainerAutoConfiguration自動配置類之前先給容器中註冊一些後置處理器,在ioc容器中滿足條件的Bean創建對象並且賦值好了,調用初始化方法之前,會做一些準備工作,下面我們打開這個註冊器BeanPostProcessorsRegistrar,看看註冊了哪些後置處理器(BeanPostProcessors),打開這個來,看這裏
小編帶着小白看springboot源碼7
打開這個嵌入式servlet容器定製器的後置處理器(這個單詞夠長......),打來這個很長的後置處理器,看這個方法
小編帶着小白看springboot源碼7
小編帶着小白看springboot源碼7
到這裏就差不多了,一個很大的循環,和最開始的嵌入式servlet容器定製器鏈接起來了,哈哈,剖析了清楚了,還是很容易的,而且,上圖中我們還可以看看getCustomizers()是怎麼獲取所有的定製器的,點開這個方法
小編帶着小白看springboot源碼7
最後這個是一個簡單的方法,就是容器中按照某種類型獲取某些組件,然後保存起來,供別的方法遍歷,每一個都去執行一個方法,這種模式在springboot中大量的可以看到。

  因爲這一節東西比較多,我就總結一下。

  總結全過程:啓動springboot應用,創建ioc容器(這個過程我也會找個時間好好說一下ioc容器創建全過程,這裏暫時掠過)---------->刷新ioc容器----------->會導入很多的自動配置類,其中就有一個EmbeddedServletContainerAutoConfiguration,這個配置類起作用,又會往ioc容器中導入後置處理器的註冊器(BeanPostProcessorsRegistrar)向容器中導入那個很長的後置處理器(EmbeddedServletContainerCustomizerBeanPostProcessor),還會導入tomcat容器工廠(TomcatEmbeddedServletContainerFactory)----------->在這個容器工廠內部就會創建tomcat容器,然後進行一些參數的配置,再包裝成嵌入式tomcat,同時我們配置的嵌入式容器定製器(EmbeddedServletContainerCustomizer)加載到ioc容器裏,這個時候就會觸發那個很長的後置處理器去拿到容器裏所有的嵌入式容器定製器,遍歷,執行customize方法也爲嵌入式tomcat配置一些參數(當然,這些配置是我們寫的,優先級更高)---------->tomcat啓動

  哎,水平有限只能分析到這裏,還是說一句,這裏只是粗略的說了一下原理,真實情況下會更加複雜,等我什麼時候水平到了,再繼續分析吧!

  後面,我會分析分析springboot從啓動開始怎麼工作,包括ioc容器的創建過程(這個其實屬於spring註解版的內容);以及springboot不用嵌入式Tomcat,並支持jsp的做法,這些東西會總結一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章