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初始化过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python提示对话框自动关闭_Pyth
- 下一篇: python实战演练_《Python高效