1. 程式人生 > >帶著萌新看springboot原始碼07

帶著萌新看springboot原始碼07

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

  這一節就來說說如何改變servlet容器的配置引數,一般有兩種常見的方式,第一種:配置檔案(properties和yml);第二種:往容器裡新增元件的方式

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

1.通過配置檔案的方式配置

  yml為例,下圖所示,這是配置容器啟動的埠

  而且我們可以點開這個埠,可以發現

  而這個ServerProperties的很多屬性,port,adress,serverPath等等都可以在配置檔案中server.xxx=xxxxx進行修改。

  在這個類中,起作用的主要是這個customize方法來設定容器的屬性

 2.通過嵌入式servlet容器定製器設定(這種配置比上面優先順序高)

隨便找個配置類,如下程式碼(也可以配置其他屬性,我用最簡單的port演示一下)

  可以啟動容器,看控制檯,8082埠,啟動成功,而且覆蓋了yml配置的8080埠,這種方式的優先順序更高。

3.一起來剖析原理(Tomcat為例)

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

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

  開啟一個叫做EmbeddedServletContainerAutoConfiguration的類,翻譯就叫做嵌入式servlet容器自動配置。

     重點是這個自動配置類裡面的配置(就以預設的tomcat為例) 

  只要添加了tomcat的依賴,會為ioc容器裡面新增Tomcat的嵌入式servlet容器工廠,開啟這個容器工廠

  點開這個類之後。我們主要看這裡

  一直到這裡,tomcat的配置都過了一遍,總結一下啊:只要EmbeddedServletContainerAutoConfiguration這個配置類生效------->向ioc容器匯入TomcatEmbeddedServletContainerFactory元件---------->這個tomcat嵌入式容器工廠裡面會建立正常Tomcat容器物件---------->然後進行封裝成嵌入式型別的容器,內部會直接啟動Tomcat,從這裡可以大概看出來先啟動的ioc容器,然後再是Tomcat容器

  是不是還忘記了前面說的,這個自動配置類要起作用,會提前在ioc容器中匯入一個註冊器,這個元件很關鍵,他會在EmbeddedServletContainerAutoConfiguration自動配置類之前先給容器中註冊一些後置處理器,而後面再ioc容器中滿足條件的Bean建立物件但是還沒有賦值的時候,會做一些準備工作,下面我們開啟這個註冊器BeanPostProcessorsRegistrar,看看註冊了哪些後置處理器(BeanPostProcessors),開啟這個來,看這裡

 

  開啟這個嵌入式servlet容器定製器的後置處理器(這個單詞夠長......),打來這個很長的後置處理器,看這個方法

  到這裡就差不多了,一個很大的迴圈,和最開始的嵌入式servlet容器定製器連結起來了,哈哈,剖析了清楚了,還是很容易的,而且,上圖中我們還可以看看getCustomizers()是怎麼獲取所有的定製器的,點開這個方法

   最後這個是一個簡單的方法,就是容器中按照某種型別獲取某些元件,然後儲存起來,供別的方法遍歷,每一個都去執行一個方法,這種模式在springboot中大量的可以看到。

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

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

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

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