django啟動時執行某個方法,springmvc項目在啟動完成之后執行一次方法_SpringMVC源碼分析

 2023-11-11 阅读 25 评论 0

摘要:一 SpringMVC運行原理二 SpingMVC源碼分析django啟動時執行某個方法、1 DispatcherServlet1.1 DispatcherServlet繼承結構SpringBoot項目、ServletConfig對象獲取Init標簽中的配置信息1.1.1 HttpServletBean HttpServletBean復習了init方法,主要做一些初始化的工作麻將

一 SpringMVC運行原理

9ebccbbfac9496de487f54b6660640d8.png

二 SpingMVC源碼分析

django啟動時執行某個方法、1 DispatcherServlet

1.1 DispatcherServlet繼承結構

SpringBoot項目、

e391d4567bf155e4cb4c6ba556c8e1e6.png

ServletConfig對象獲取Init標簽中的配置信息

1.1.1 HttpServletBean

HttpServletBean復習了init方法,主要做一些初始化的工作麻將web.xml中配置的參數

設置到Servlet中。比如servlet標簽中的子標簽init-param標簽中配置的參數

40243c6cbd0641c213714e9a3c17f538.png

1.1.1.1 ServletConfigPropertyValues

ServletConfigPropertyValues是HttpServletBean的靜態內部類。在其構造方法中通

過傳遞的ServletConfig對象對web.xml文件中的DispatcherServlet節點中的參數及

及逆行解析處理

7542feb2a0c5b6fcad7647e740bfb23a.png

1.1.1.2 BeanWrapper bw =PropertyAccessorFactory.forBeanPropertyAccess(this):

將 HttpServletBean 類型轉換為 BeanWrapper 類型,從而能對 init-parameter 的

值進行注入。

1.1.1.3 bw.registerCustomEditor(Resource.class,

newResourceEditor(resourceLoader,getEnvironment())):

注冊自定義屬性編輯器,遇到 Resource 類型的屬性將會使用 ResourceEditor 進行解析

1.1.1.4 initBeanWrapper(bw):該方法并未做什么,為了留給子類覆蓋。

1.1.1.5 bw.setPropertyValues(pvs,true): 設置 DispatcherServlet 屬性

1.1.1.6 initServletBean(): 調用在 FrameworkServlet 中覆蓋的該方法

* 當spingmvc啟動時會調用init方法獲取inint標簽中屬性的值,將值封裝到

ProperValues中

1.1.2 FrameworkServlet

將 Servlet 上下文與 Spring 容器上下文關聯。其實也就是初始化 FrameworkServlet

的屬 性webApplicationContext , 這 個 屬 性 代 表 SpringMVC 上 下 文 對 象 , 實

際 類 型ConfigurableWebApplicationContext。如果項目中用到spring了那么它有個

父容器,既web.xml 中配置的 ContextLoaderListener 監聽器初始化的容器上下文。

1b2d5a2e8031afa80f45ca7eac5da74f.png

1.1.2.1 this.webApplicationContext = initWebApplicationContext():

可以看到,最重要的就是

this.webApplicationContext=initWebApplicationContext(); 這段代碼,這個方法的

作用是創建或刷新 WebApplicationContext 實例。如果項目中使用 到了 spring,則

進行父子容器關聯。

1.1.2.2 initWebApplicationContext()方法:

0d17edbb13d4c3433cfe7a4ed232c7b4.png

b945b95f401dba7d6d8db3edef01112f.png

如果項目中使用 spring 框架,并且在 web.xml 文件中配置了 Listener 來啟動 spring。那 么在監 聽器中 spring 會創建 WebApplicationContext 容器。 此時會將 該容器轉換 為 ConfigurableWebApplicationContext 即 SpringMVC 容器。

3b18fae2d443d0ed47dbfecd922fe5a9.png

如果沒有在 web.mxl 文件中配置 Listener 那么此時 webApplicationContext 為 空 則 去

ServletContext 中 根 據 attrname 查 找 。 如 果 為 找 到 , 執 行

createWebApplicationContext 方法來創建 SpringMVC 的容器。

1.1.2.3 createWebApplicationContext(rootContext):

1fb254bc4b3914dbc0f0fbff23ed99a0.png

1.1.2.4 createWebApplicationContext(ApplicationContext parent)

cd009ad470bfee018bb757535672414a.png

1.1.2.5 configureAndRefreshWebApplicationContext

(ConfigurableWebApplicationContextwac):

b4dc2cfd5f7533b46904bd904aef9aae.png

1.1.2.6 refresh():

解析配置文件初始化 SpringMVC 的 IOC 容器環境。 解析 springmvc 配置文件:

初始化所有的bean對象

421e47fb0f00557c0efa98f0d7fd9b23.png

解析命名空間

0c3027775240fbf3fc6afb2c54ba3695.png

1.1.3DispatcherServlet

1.1.3.1 ContextRefreshListener

5973c3f43febae96feacf03fcb4fe910.png

1.1.3.2 onRefresh(ApplicationContextcontext):

1.1.3.3 initStrategies(ApplicationContextcontext): 初始化 SpringMVC 其他組件:如多

部件解析器、處理器映射器、處理器適配器、視圖解析器等。

8cc3cc93ce09dca0e11c13ba408bc00b.png

2 HandlerMapping接口

2.1 初始化HandlerMapping接口

2.1.1initStrategies

23ac63e44abb2376267af399fc345a5a.png

2.1.2initHandlerMappings

d0e1cb276c37250d75eddd8f4c12aac6.png

2.2HandlerMapping 接口介紹

作用是根據當前請求的找到對應的Handler(HandlerMethod(Controller 中的方法)、

Controller 對 象 ),并將Hanler與一堆HandlerInterceptor (攔截器)封裝到

HandlerExecutionChain 對象中。在HandlerMapping接口的內部只有一個方法

HandlerExecutionChaingetHandler(HttpServletRequestrequest);

2.3HandlerMapping 接口實現類

HandlerMapping 實現類有兩個分支,分別繼承自

AbstractHandlerMethodMapping(得 到 HandlerMethod)和

AbstractUrlHandlerMapping(得到 Controllert),它們又統一繼承于

AbstractHandlerMapping。

1735cca1ad2b09fd27e4c88c02f2b029.png

2.3.1 AbstractHandlerMapping抽象類

它實現了 HandlerMapping 接口中的 getHandler() 方法

01e5efb6f883970e9887b0b47956a91d.png

2.3.1.1 AbstractHandlerMethodMapping

AbstractHandlerMethodMapping 這個分支獲取的 Handler 的類型是

HandlerMethod,即 這個Handler 是一個方法,它保存了方法的信息(如

Method),這樣一個 Controller 就可 以處理多個請求了。

64edeaf47e74fbc33a914368e8e655ce.png

上述代碼中 lookupHandlerMethod() 方法主要工作是在 Map<T, HandlerMethod>

handlerMethods 中找到 HandlerMethod,這里的 T 是 HandlerMappingInfo,它

封裝了 @RequestMapping 注解中的信息(url),HandlerMethodshurl對應的方法。

2.3.1.2 AbstractUrlHandlerMapping 抽象類

AbstractUrlHandlerMapping 這個分支獲取的 Handler 的類型實際就是一個

Controller類。

a458f85a731ad1a028cd4443f7aa8b5c.png

e9c378fc33df5f065c048fa9268ea999.png

3 HandlerAdapter 接口

SpringMVC 中使用適配器模式來解決不同的 Handler 的執行。根據 Handler 來找到支

持它的HandlerAdapter,通過 HandlerAdapter 執行這個 Handler 得到

ModelAndView 對 象。

3.1接口中的抽象方法

booleansupports(Objecthandler); 判斷是否支持傳入的 Handler ModelAndView

handle(HttpServletRequest request, HttpServletResponse response, Object

handler) :用來使用 Handler 處理請求

long getLastModified(HttpServletRequest request, Object handler); 用 來 獲 取 資

料 的 Last-Modified 值

3.2 HandlerAdapter繼承結構

23b20d9a2e6d3d90ef4ae198a29f09df.png

3.3 AbstractHandlerMethodAdapter 抽象類

利用 RequestMappingHandlerMapping 獲取的 Handler 是 HadnlerMethod 類型,

它代 表 Controller 里要執行的方法。handlerInternal 是子類

RequestMappingHandlerAdapter 中的 方法。

317ae6e12b467e467498fd9de8e4f73e.png

3.4 RequestMappingHandlerAdapter 類

RequestMappingHandlerAdapter 實際就是執行@RequestMapping 注解的方法

3.4.1 handleInternal 方法

在 handlerInternal 方法中通過調用 invokeHandleMethod 方法執行

HandlerMethod 并返回 一個 ModelAndView。

02ad7b501bfa7a291a5dac022c0ee518.png

3.4.2invokeHandleMethod 方法

926da890c5e646f9eed4d6abf1d5514d.png

3.5 HttpRequestHandlerAdapter 類

HttpRequestHandlerAdapter 。 是 HttpRequestHandler 的 適 配 器 可 以 執 行

HttpRequestHandler 類型的 Handler。其實就是 Controller 中的 handleRequest 方法

bb278e7faaecacc1547085fdd2d3c690.png

3.6 SimpleControllerHandlerAdapter 類

SimpleControllerHandlerAdapter 是 Controller 實現類的適配器類,其本質也是執行

Controller 中的 handleRequest 方法。

261f0e1b435fe1a87b733b06f8177223.png

3.7 SimpleServletHandlerAdapter 類

SimpleServletHandlerAdapter 其實是一個 Servlet 的適配器,其最終執行的方法是

Servlet 的 service 方法、

8335629fa44ac66df6ff6ad85a00ede1.png

3.8Debug 走讀 DispatcherServlet 中初始化處理器適配器

3.8.1在配置文件中配置<mvc:annotation-driven/>

{org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA

dapter#0=org.springframework.web.servlet.mvc.method.annotation.RequestMapping

HandlerAdapter@4e afea11, org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter=org.springframew

ork.we b.servlet.mvc.HttpRequestHandlerAdapter@1a4d6190, org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter=org.springfra

mewor k.web.servlet.mvc.SimpleControllerHandlerAdapter@710d6556}

3.8.2未在配置文件中配置<mvc:annotation-driven/>

[org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@508cddf9,

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@688a3991,

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

@6f15d959]

4 ViewResolver 接口

根據視圖的名稱將其解析為 View 類型的視圖,如通過 ModelAndView 中的視圖名稱 將

其解析成 View,View 是用來渲染頁面的,也就是將 Model 填入模板中,生成 html 或

其他格式的文件。

4.1接口中抽象方法

ViewresolveViewName(StringviewName,Localelocale)throwsException;

52eb70c49ff0b874fc8a5315b0c71e98.png

4.3AbstractCachingViewResolver 抽象類

AbstractCachingViewResolver 是帶有緩存的 ViewResolver,它每次解析時先從緩存里

查 找,如果找到視圖就返回,沒有就創建新的視圖,且創建新視圖的方法由其子類實現。

e42944afbd447d8c69fa27c93c61eb33.png

4.3.2 createView方法

通過調用不同的子類中的 loadView 來指定不同視圖解析器處理視圖。

3e5d1682e10959694d555f0298ee6084.png

4.4ResourceBundleViewResolver 類

ResourceBundleViewResolver 根據 views.properties 文件來解析視圖,這個文件應位于

classpath 路徑下

23c3230578ae5e03b167a6c0e9ef37ed.png

4.5XmlViewResolver 類

XmlViewResolver 根據 xml 文件來解析視圖

ef38701e86db9965429d58c6c8b1a823.png

4.6UrlBasedViewResolver 類

UrlBasedViewResolver 提供了拼接 URL 的方式來解析視圖,通過 prefix 屬性拼接一 個

前綴,通過 suffix 屬性拼接一個后綴,就得到了視圖的 URL。還可以加入 redirect: 與、

forword: 前綴,使用 redirect: 前綴會調用 HttpServletResponse 對象的

sendRedirect() 方法 進行重定向,使用 forword: 前綴會利用 RequestDispatcher 的

forword 方式跳轉到指定的地 址。另外,使用時還要指定 viewClass 屬性,表示要解析

成哪種 View。

5a9dd88c7e37a53b2853bfbfc14b2075.png

3d836a39fe3e41c985c9fd76d712a012.png

4.7InternalResourceViewResolver 類

InternalResourceViewResolver 是 UrlBasedViewResolver 的 子 類 , 將

InternalResourceView 作為默認的 View 類,但如果當前 classpath 中有 jstl 的 jar 包

時則 使用 JstlView 作為 view 來渲染。

4.7.1 UrlBasedViewResolver 類

b46499dcadbea83b1045e00f3c88a89a.png

4.7.2InternalResourceViewResolver 類

faf0ad41a87a9cde5ba938656bbb22e5.png

5 View接口

視圖渲染器,在該接口中定義了渲染視圖的抽象方法。 何為渲染:所謂渲染其實就是將

Model 中的數據放到 HttpServletRequest 中傳遞 jsp。

void render(Map<String, ?> model, HttpServletRequest request,

HttpServletResponse response)throwsException;

5.1 結構結構

40e0b4724f34731c084b74cf78d87668.png

5.2 InternalResourceView 類

繼承自 AbstractUrlBasedView 抽象類的類,表示 JSP 視圖

5.3Debug 走讀 ViewResolver

5.3.1DispatcherServlet 初始化視圖解析器

709bd5256f08f97155e2518521b4d476.png

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/170193.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息