帶着萌新看springboot源碼07


  【修改】很長時間沒看這個,有點弄混淆了。bean后置處理器(BeanPostProcessor)應該是在bean創建實例並且賦值好了之后,調用初始化方法(相當於xml配置中<bean init=“初始化方法”>)的前后會調用后置處理器的那兩個方法。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM