日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java dispatcher详解_dispatcherservlet初始化过程详解

發布時間:2025/3/11 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java dispatcher详解_dispatcherservlet初始化过程详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前給大家介紹了什么是dispatcherservlet,以及dispatcherservlet配置等方面的內容,那么下面要接著給大家介紹的就是dispatcherservlet初始化過程,一起來了解一下。

Web容器啟動時將調用HttpServletBean的init方法public?abstract?class?HttpServletBean?extends?HttpServlet?implements?EnvironmentAware

{

@Override

public?final?void?init()?throws?ServletException

{

//省略部分代碼

//1、如下代碼的作用是將Servlet初始化參數設置到該組件上

//如contextAttribute、contextClass、namespace、contextConfigLocation;

try

{

PropertyValues?pvs?=?new?ServletConfigPropertyValues(getServletConfig(),?this.requiredProperties);

BeanWrapper?bw?=?PropertyAccessorFactory.forBeanPropertyAccess(this);

ResourceLoader?resourceLoader?=?new?ServletContextResourceLoader(getServletContext());

bw.registerCustomEditor(Resource.class,?new?ResourceEditor(resourceLoader,?this.environment));

initBeanWrapper(bw);

bw.setPropertyValues(pvs,?true);

}

catch?(BeansException?ex)

{

//…………省略其他代碼

}

//2、提供給子類初始化的擴展點,該方法由FrameworkServlet覆蓋

initServletBean();

if?(logger.isDebugEnabled())

{

logger.debug("Servlet?'"?+?getServletName()?+?"'?configured?successfully");

}

}

//…………省略其他代碼

}

把Servlet初始化參數(init-param)設置到這個組件上(如contextAttribute、contextClass、namespace、contextConfigLocation),通過BeanWrapper簡化設值過程,便于之后使用;

提供給子類初始化擴展點,initServletBean(),這個方法由FrameworkServlet覆蓋。

FrameworkServlet通過initServletBean()進行Web上下文初始化public?abstract?class?FrameworkServlet?extends?HttpServletBean

{

@Override

protected?final?void?initServletBean()?throws?ServletException

{

//省略部分代碼

try

{

//1、初始化Web上下文

this.webApplicationContext?=?initWebApplicationContext();

//2、提供給子類初始化的擴展點

initFrameworkServlet();

}

//省略部分代碼

}

}

這個方法主要作用:?初始化web上下文;

提供給子類初始化擴展點;

protected?WebApplicationContext?initWebApplicationContext()

{

//ROOT上下文(ContextLoaderListener加載的)

WebApplicationContext?rootContext?=

WebApplicationContextUtils.getWebApplicationContext(getServletContext());

WebApplicationContext?wac?=?null;

if?(this.webApplicationContext?!=?null)

{

//?1、在創建該Servlet注入的上下文

wac?=?this.webApplicationContext;

if?(wac?instanceof?ConfigurableWebApplicationContext)

{

ConfigurableWebApplicationContext?cwac?=?(ConfigurableWebApplicationContext)?wac;

if?(!cwac.isActive())

{

if?(cwac.getParent()?==?null)

{

cwac.setParent(rootContext);

}

configureAndRefreshWebApplicationContext(cwac);

}

}

}

if?(wac?==?null)

{

//2、查找已經綁定的上下文

wac?=?findWebApplicationContext();

}

if?(wac?==?null)

{

//3、如果沒有找到相應的上下文,并指定父親為ContextLoaderListener

wac?=?createWebApplicationContext(rootContext);

}

if?(!this.refreshEventReceived)

{

//4、刷新上下文(執行一些初始化)

onRefresh(wac);

}

if?(this.publishContext)

{

//?Publish?the?context?as?a?servlet?context?attribute.

String?attrName?=?getServletContextAttributeName();

getServletContext()

.setAttribute(attrName,?wac);

//省略部分代碼

}

return?wac;

}

從initWebApplicationContext()方法能夠看出,通常假如ContextLoaderListener加載了上下文將作為根上下文(DispatcherServlet的父容器),最后調用了onRefresh()方法執行容器的一些初始化,這個方法由子類實現,來進行擴展。

DispatcherServlet實現了onRefresh()方法提供一些前端控制器相關的配置public?class?DispatcherServlet?extends?FrameworkServlet

{

//實現子類的onRefresh()方法,該方法委托為initStrategies()方法。

@Override

protected?void?onRefresh(ApplicationContext?context)

{

initStrategies(context);

}

//初始化默認的Spring?Web?MVC框架使用的策略(如HandlerMapping)

protected?viod?initStrategies(ApplicationContext?context)

{

initMultipartResolver(context);?//初始化上傳文件解析器

initLocaleResolver(context);?//初始化本地解析器

initThemeResolver(context);?//初始化主題解析器

initHandlerMapping(context);

//初始化處理器映射器,將請求映射到處理器

initHandlerAdapters(context);?//初始化處理器適配器

initHandlerExceptionResolver(context);

//初始化處理器異常解析器,如果執行過程中遇到異常將交給HandlerExceptionResolver來解析

initRequestToViewNameTranslator(context);

//初始化請求到具體視圖名稱解析器

initViewResolvers(context);

//初始化視圖解析器,通過ViewResolver解析邏輯視圖名到具體視圖實現

initFlshMapManager(context);?//初始化flash映射管理

}

}

initStrategies方法將在WebApplicationContext初始化后自動執行,自動掃描上下文的Bean,依據名稱或者是類型匹配的機制查找自定義組件。

假如沒有找到,就會裝配一套Spring的默認組件.在org.springframework.web.servlet路徑下有一個DispatcherServlet.properties配置文件,這個文件指定了DispatcherServlet所使用的默認組件。

DispatcherServlet啟動的時候,會進行需要的Web層Bean的配置,例如HandlerMapping、HandlerAdapter等,假如,沒有配置,還會給我們提供默認的配置。

整個DispatcherServlet初始化的過程具體主要做了初始化Spring Web

MVC使用的Web上下文,并且可能指定父容器為(ContextLoaderListener加載了根上下文)以及初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等這兩件事情。

現在有很多人都想要成為java架構師,假如你想了解這方面的知識,那么請繼續關注奇Q工具網來進行了解吧。

推薦閱讀:

總結

以上是生活随笔為你收集整理的java dispatcher详解_dispatcherservlet初始化过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。