【修改】很長時間沒看這個,有點弄混淆了。bean後置處理器(BeanPostProcessor)應該是在bean建立實例而且賦值好了以後,調用初始化方法(至關於xml配置中<bean init=「初始化方法」>)的先後會調用後置處理器的那兩個方法。spring
上一節在springboot中配置了servlet三大組件以及嵌入式servlet容器,而且還簡單的說了如何切換不一樣的容器。tomcat
這一節就來講說如何改變servlet容器的配置參數,通常有兩種常見的方式,第一種:配置文件(properties和yml);第二種:往容器裏添加組件的方式springboot
注意注意:我這裏說的容器和嵌入式容器不同的,容器指的是ioc容器,嵌入式servlet容器值得是servlet容器,不要混淆了jsp
1.經過配置文件的方式配置spa
yml爲例,下圖所示,這是配置容器啓動的端口翻譯
並且咱們能夠點開這個端口,能夠發現3d
而這個ServerProperties的不少屬性,port,adress,serverPath等等均可以在配置文件中server.xxx=xxxxx進行修改。server
在這個類中,起做用的主要是這個customize方法來設置容器的屬性xml
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的作法,這些東西會總結一下。