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

帶著萌新看springboot源碼07

我們 tomcat配置 str 兩種 內部 新io color 處理器 並且

  上一節在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的做法,這些東西會總結一下。

帶著萌新看springboot源碼07