程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SpringMVC的源碼解析

SpringMVC的源碼解析

編輯:關於JAVA

SpringMVC的源碼解析。本站提示廣大學習愛好者:(SpringMVC的源碼解析)文章只能為提供參考,不一定能成為您想要的結果。以下是SpringMVC的源碼解析正文


學習java的人都知道spring,springMVC,mybatis等框架,像structs2這樣的框架是基於servlet以外完成的,而springMVC是基於servlet容器完成的,

本文將剖析SpringMVC的中心分發器DispatcherServlet的初始化進程以及處置懇求的進程,讓讀者理解這個入口Servlet的作用。

在剖析DispatcherServlet之前,我們先看下DispatcherServlet的承繼關系,

HttpSerlvetBean承繼自HttpServlet。

HttpServletBean覆寫了init辦法,對初始化進程做了一些處置。 以下是初始化的代碼:

首先,ServletConfigPropertyValues是HttpServletBean的靜態類,結構進程會運用ServletConfig對象找出web.xml文件中配置參數,並設置到ServletConfigPropertyValue,運用BeanWrapper來結構DispatcherServlet, 獲取ServletContextResourceLoader的資源加載器,然後注冊資源編輯器,初始化BeanWrapper對象,設置DispatcherServlet屬性,默許初始化ServletBean不做任何處置,子類掩蓋該辦法可以做任何事情,

以下是web.xml文件配置:

這段配置初始化參數為contextConfigLocation,後來結構的是BeanWrapper對象, 由於contextConfigLocation在FrameworkServlet中定義,但是沒有在HttpServletBean中定義,應用Spring的注入特性,只需求調用setContextConfigLocation辦法,就可以將contextConfigLocation設置到對應的實例當中,然後設置DispatcherServlet中contextConfigLocation(FrameworkServlet中定義)的屬性,為web.xml讀取contextConfigLocation參數,該資源文件用結構SpringMVC的容器的上下文。

上面看下FrameworkServlet這個類,FrameworkServlet承繼自HttpServletBean。

以下是initServletBean的代碼:

首先第一步是初始化WebApplicationContext,它是承繼於ApplcationContext的接口,ApplcationContext是Spring容器的上下文,Servlet和Spring容器關聯的作用,然後初始化FrameWorkServlet,其實它空的,什麼也做,子類重寫這個辦法,可以做任何處置,不過DispatcherServlet偏重寫這個辦法。

上面是初始化initWebApplicationContext的詳細完成邏輯: 

    

首先,失掉根途徑,DistpatcherServlet有個WebApplication為參數的結構函數,假如注入了WebApplication 這個對象,就會執行上圖代碼。

FrameworkServlet中有個String類型的contextAttribute的變量名,以它為key在ServletContextWebApplicationContext,普通不會設置,contextAttribute屬性,也就說,wac開端是null;接上去就是創立WebApplicationContext,並設置根上下文為父上下文,然後配置ServletConfig,ServletContext等到這個上下文,這個類中有個函數onReFresh是一個模版辦法,在WebApplication成功創立後就會調用,FrameworkServlet的完成類,就會重寫這個辦法,並將創立的容器上下文設置到ServletContext中,這裡的根上下文是web.xml中配置的ContextLoaderListener監聽器中依據contextConfigLocation途徑生成的上下文。

比方這段配置文件中依據classpath:context-*.xml下的xml文件生成的根上下文。

接著看一下DispatcherServlet重寫了FrameworkServlet中onReFresh辦法,

可以看到initStrategies辦法中,在初始化各種各種戰略接口的完成類, 前面再逐個剖析各個戰略接口的完成的詳細引見。

總結一個三個類的作用:

HttpServletBean 次要做一些初始化的任務,將web.xml中配置的參數設置到Servlet中。比方servlet標簽的子標簽init-param標簽中配置的參數。

FrameworkServlet 將Servlet與Spring容器上下文關聯。其實也就是初始化FrameworkServlet的屬性webApplicationContext,這個屬性代表SpringMVC上下文,它有個父類上下文,web.xml中配置的ContextLoaderListener監聽器初始化的容器上下文。

DispatcherServlet 次要是初始化一些各個戰略接口的完成。比方懇求處置,試圖處置。處置的適配等。

DispatcherServlet懇求處置進程:

先看下HttpServlet提供的辦法用於處置懇求,service運用了模版形式,關於HttpServlet的get懇求,調用doGet辦法,post請 求,調用doPost辦法........

在看下處置processRequest函數

首先,獲取於以後線程綁定的LocaleContext和ServletRequestAttributes對象,initContextHoers函數就是讓新結構的LocaleContex和requestAttributes停止關聯,這個關聯運用ThreadLocal完成,doService辦法是籠統辦法,詳細由DispatcherServlet完成。

最後調用resetContextHolders函數重置LocaleContext和RequestAttribute對象,解除LocaleContext和RequestAttribute對象的綁定。執行成功後,發布ServletRequestHandlerEvent事情,可以經過注冊監聽器來監聽該事情的發布。注冊的監聽器類型為ApplicationListener接口類型。

接上去是DispatcherServlet的doService辦法.

假如該懇求是include的懇求,那麼保存一份快照版本的request域中的數據,doDispatch辦法之後,這個快照版本的數據將會掩蓋新的Requet域的數據。  

然後在request中設置一些屬性,最後doDispatcher停止懇求分發處置。      

doDispatch辦法功用大致進程如下:

首先依據懇求的途徑,經過RequestMapping的注解映射,找到HandlerMethod(也就是對應Controller中的辦法),然後婚配途徑對應的阻攔器,有了HandlerMethod和阻攔器結構個HandlerExecutionChain對象。HandlerExecutionChain對象的獲取是經過HandlerMapping接口提供的辦法中失掉。

有了HandlerExecutionChain之後,經過handlerAdapter對象停止適配處置,失掉ModelAndView對象,HandlerMethod外部handle的時分,運用各種HandlerMethodArgumentResolver完成類處置HandlerMethod的參數,運用各種HandlerMethodReturnValueHandler完成類處置前往值,最終前往值被處置成一個ModelAndView對象,這時期發作的異常會被HandlerExceptionResolver接口完成類停止處置.

總結: 本文次要剖析DispatcherServlet及其父類FrameworkServlet和HttpServletBean它們的作用。以及一個懇求四處理前往,大致進程的剖析。

以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved