Spring MVC 的原始碼分析 1

2021-08-14 22:09:25 字數 2704 閱讀 7942

總結:

外部容器通過***傳給spring mvc初始化,這個初始化我們是以分散重寫初始化邏輯進入spring ioc 初始化,然後在返回到spring mvc自己的上下文九大元件初始化

spring mvc 底層是設計原理是 前端控制模式

我們拿著總結和上面這張圖去看具體實現過程,不然在細節過程,我們很容易就迷糊了,拿到總結讓我們有一種一覽眾山小的視角去俯瞰細節.

1.--------spring mvc實現了servlert規範--------

這個是servlet的相關方法

為什麼說spring mvc是實現了servlet的方法呢?我們去看一下原始碼

我們知道dispatchservlet是spring mvc的核心控制器,由原始碼可以看出,它的父類就是 genericservlet,而genericservlet的父類也是servlert,所以說,spring mvc是實現了servlet的規範

2.------spring mvc初始化的過程--------

容器啟動的時候初始化,既然上面說了spring mvc實現了servlet規範,那麼它肯定也會有相應的 init , service , destroy.

不過區別是在 這三個方法是在不同的類實現的,並不是每個類都重寫了這三個方法,每個類都會有自己專注的事情來做.

來,我們看下面這幾張圖,有以下幾張圖我們可以分析出父類的genericservlet的init初始化方法,其實最後是第三張圖中httpservlert子類給重寫了

(1)genericservlet進行初始化(爺爺輩)

(2)httpservlet 做了service方法(兒子輩)

(3)進行了init初始化的方法重寫 (孫子輩)

3.------httpservletbean的初始化方法細節-------------

(1)init初始化方法

(2)真正的初始化方法 initservletbean方法

(3)構建spring mvc自己的上下文環境

//這個方法主要是構建spring mvc自己的上下文

//拿到根上下文環境 spring ioc

//建立spring mvc自己的上下文,但是沒有例項化

//如果不為空說明已經通過構造方法設定了乙個上下文物件

//當前的spring mvc的上下文

//這裡判斷這個上下文有沒有被啟用過,bean關係有沒有更新一次

if(!attrname.isactive())

//沒有啟用就重新啟用一下 我們在看一下啟用的具體實現

} }

}if(wac == null)

if(wac == null)

if(!this.refresheventreceived)

if(this.publishcontext)

}return wac;

}

(4)啟用上下文的方法
//這裡是啟用上下文的方法

protected void

if(objectutils.identitytostring(wac).equals(wac.getid())) else

}//設定上下文環境

wac.setservletcontext(this.getservletcontext());

//設定配置資訊

wac.setservletconfig(this.getservletconfig());

//設定命名空間

wac.setnamespace(this.getnamespace());

configurableenvironment env = wac.getenvironment();

if(env instanceof configurablewebenvironment)

//刷下上下文

wac.refresh();

}

(5)我們再來看初始化的最後一步

至此spring mvc的初始化結束

SpringMVC 原始碼分析

springmvc之 springmvc的引數匹配原始碼分析 使用 modelattribute 進行引數注入 springmvc方法返回值詳解 原始碼流程 public class implements configuration componentscan com enableaspectjau...

SpringMVC原始碼分析 二

第九章 spring aop 原始碼解析 二 這一章來簡單的介紹一下springmvc的高階應用 過濾器 filter 對request請求起到過濾的作用,作用在servlet之前,如果配置為 可以對所有的資源訪問 servlet js css靜態資源等 進行過濾處理 interceptor 是sp...

Spring MVC 的原始碼分析 2

spring mvc 如何在servlet容器中處理業務的?我們依次檢視原始碼中三個方法的具體內容 1 requestmethod.patch都包含那些列舉型別呢?public enum requestmethod 2 processrequest方法是如何進行分流的呢?3 當所有的method方法...