帶著萌新看springboot原始碼04
繼續開頭說些廢話,我也不知道什麼鬼,每次寫著寫著經常會寫到其他地方去了,太容易分神了。
這次說一下springboot對於springmvc的大概整個流程,以請求動態網頁為例 。
1.梳理一下springmvc的大概流程
首先是客戶端(瀏覽器)傳送請求到前端控制器(dispatcherServlet)-------------->前端控制器就會去呼叫處理器對映器(HandlerMapping),去尋找真正的Handler(其實就是controller),返回執行器鏈(HandlerExecutionChain,本質上就是目標Handler和一些攔截器組成的)給前端控制器----------->前端控制器就去呼叫處理器介面卡(HandlerAdapter)去執行這個Handler,返回模型資料和檢視(ModelAndView)給前端控制器------------->前端控制器從ModelAndView中獲取邏輯檢視(可以理解為controller返回的字串),前端控制器呼叫檢視解析器(ViewResolver)找到真正的檢視(可以理解為就是加了一個前後綴,例如上節將的去類路徑下找 “/template/xxx.html”)-------------->將真正的檢視返回到前端控制器------------>模板引擎去渲染解析真正的檢視響應客戶端(ssm中就是去把裡面寫的jsp標籤內容以及html標籤內容,都變成servlet,然後響應客戶端)
2.springboot的流程
其實吧,springboot暫時可以理解為ssm中的springmvc+spring,雖然說這個理解不準確,但是有助於理解,不然腦中就只有一個印象:springboot很牛逼,做web應用特快,不需要配置,還是一個框架。。emmmm.....
所以,以前springmvc配置的東西,springboot裡面也有,前端控制器,對映器,介面卡,檢視解析器等在springboot中也有,就看你會不會找。(不用想,肯定在那xxxAutoConfiguration中!不然載入那麼多自動配置類吃多了啊....)
好,第一步,我們先來找找前端控制器,在那些自動配置類中,有個叫做DispatcherServletAutoConfiguration,開啟這個類(ctrl+滑鼠左鍵,嘿嘿)
開啟DispatcherServlet這個類的doDispatcher方法
到這裡,就完成一部分了,再之後,ModelAndView返回到前端控制器,我們再來看看檢視解析器
開啟這個配置類,並找到檢視解析器的元件
接下來,我們就看看上圖中 ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();這裡是如何設定檢視解析器的。開啟這個類並找方法initServletContext(獲取容器中的所有檢視解析器,這點很是關鍵,那是不是我寫一個檢視解析器放進容器,在這裡是不是也會取到呢?答案當然是可以取到,這也是後面我們自己定製一個檢視解析器的方法,而且,從這裡可以看到,我們要自己定製一個元件,只需要實現相應元件的介面,然後丟到容器裡就可以了,是不是很簡單!)
viewResolver這個集合肯定很有用,果然,後面馬上就用到了
到這裡,大概的過程就走了一遍了,後面的就是模板引擎去渲染頁面響應了,沒什麼說的,具體的還是要自己走走原始碼就差不多了(估計不會去走原始碼,咳咳)。
其實說了這麼多,大家也發現了,暫時springboot重點就是那些xxxAutoConfiguration,有了這些自動配置類,才能讓我們去關注邏輯,而不是那些機械化的配置。
下一節就說說我們往這些元件新增更多功能,因為由於一些特殊原因,springboot自動配置的功能不能滿足我們的要求。或者乾脆了說,我們想要把springboot某個元件替換掉,用我們自己寫的元件,多好。