spring mvc技術

一、SpringMVC的運行流程

⑴ 用戶發送請求至前端控制器DispatcherServletcss

⑵ DispatcherServlet收到請求調用HandlerMapping處理器映射器。html

⑶ 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。前端

⑷ DispatcherServlet經過HandlerAdapter處理器適配器調用處理器spring

⑸ 執行處理器(Controller,也叫後端控制器)。數據庫

⑹ Controller執行完成返回ModelAndView後端

⑺ HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServletapp

⑻ DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器框架

⑼ ViewReslover解析後返回具體Viewurl

⑽ DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。spa

⑾ DispatcherServlet響應用戶。從上面能夠看出,DispatcherServlet有接收請求,響應結果,轉發等做用。有了DispatcherServlet以後,能夠減小組件之間的耦合度。

二、SpringMVC的九大組件(DispatcherServlet)

protected void initStrategies(ApplicationContext context) {  
    //用於處理上傳請求。處理方法是將普通的request包裝成            MultipartHttpServletRequest,後者能夠直接調用getFile方法獲取File.
     initMultipartResolver(context);  
    //SpringMVC主要有兩個地方用到了Locale:一是ViewResolver視圖解析的時候;二是用到國際化資源或者主題的時候。
     initLocaleResolver(context); 
    //用於解析主題。SpringMVC中一個主題對應 一個properties文件,裏面存放着跟當前主題相關的全部資源、//如圖片、css樣式等。SpringMVC的主題也支持國際化, 
     initThemeResolver(context);  
    //用來查找Handler的。
     initHandlerMappings(context);  
    //從名字上看,它就是一個適配器。Servlet須要的處理方法的結構倒是固定的,都是以request和response爲參數的方法。//如何讓固定的Servlet處理方法調用靈活的Handler來進行處理呢?這就是HandlerAdapter要作的事情
     initHandlerAdapters(context);  
    //其它組件都是用來幹活的。在幹活的過程當中不免會出現問題,出問題後怎麼辦呢?//這就須要有一個專門的角色對異常狀況進行處理,在SpringMVC中就是HandlerExceptionResolver。
     initHandlerExceptionResolvers(context);  
    //有的Handler處理完後並無設置View也沒有設置ViewName,這時就須要從request獲取ViewName了,//如何從request中獲取ViewName就是RequestToViewNameTranslator要作的事情了。
     initRequestToViewNameTranslator(context);
    //ViewResolver用來將String類型的視圖名和Locale解析爲View類型的視圖。//View是用來渲染頁面的,也就是將程序返回的參數填入模板裏,生成html(也多是其它類型)文件。
     initViewResolvers(context);  
    //用來管理FlashMap的,FlashMap主要用在redirect重定向中傳遞參數。
     initFlashMapManager(context); 
}

2、梳理SpringMVC的設計思路

從圖中能夠看出,SpringMVC本質上是一個Servlet,這個 Servlet 繼承自 HttpServlet。FrameworkServlet負責初始化SpringMVC的容器,並將Spring容器設置爲父容器。

二、初始化階段

在前面咱們提到DispatcherServlet的initStrategies方法會初始化9大組件,可是這裏將實現一些SpringMVC的最基本的組件而不是所有,按順序包括:

  • 加載配置文件

  • 掃描用戶配置包下面全部的類

  • 拿到掃描到的類,經過反射機制,實例化。而且放到ioc容器中(Map的鍵值對  beanName-bean) beanName默認是首字母小寫

  • 初始化HandlerMapping,這裏其實就是把url和method對應起來放在一個k-v的Map中,在運行階段取出

三、運行階段

每一次請求將會調用doGet或doPost方法,因此統一運行階段都放在doDispatch方法裏處理,它會根據url請求去HandlerMapping中匹配到對應的Method,而後利用反射機制調用Controller中的url對應的方法,並獲得結果返回。按順序包括如下功能:

  • 異常的攔截

  • 獲取請求傳入的參數並處理參數

  • 經過初始化好的handlerMapping中拿出url對應的方法名,反射調用。

3、相關問答

一、爲何要用spring:

AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務   (好比日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。 

IOC 容許建立一個能夠構造對象的應用環境,而後向這些對象傳遞它們的協做對象。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每個對象都是用其協做對象構造的。所以是由容器管理協做對象(collaborator)。 

Spring既是一個AOP框架,也是一個IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協做對象)。而後能夠很容易地在須要時替換具備相似接口的協做對象。 

二、介紹一下Spring的事務管理: 

事務就是對一系列的數據庫操做(好比插入多條數據)進行統一的提交或回滾操做,若是插入成功,那麼一塊兒成功,若是中間有一條出現異常,那麼回滾以前的全部操做。 

這樣能夠防止出現髒數據,防止數據庫數據出現問題。

spring提供了幾個關於事務處理的類: 

TransactionDefinition //事務屬性定義 

TranscationStatus //表明了當前的事務,能夠提交,回滾。 

PlatformTransactionManager這個是spring提供的用於管理事務的基礎接口,其下有一個實現的抽象類AbstractPlatformTransactionManager,咱們使用的事務管理類例如DataSourceTransactionManager等都是這個類的子類。

3.Spring容器是如何管理Bean的生命週期的(如Bean的初始化方法,Bean的銷燬方法)

實例化過程:

生命週期

相關文章
相關標籤/搜索