通常如果我們希望通過註解的方式來進行spring mvc開發,我們都會在***-servlet.xml中加入標籤來告訴spring我們的目的。但是我們為什麼這麼做呢?這個標籤是什麼意思呢?它做了什麼呢?
同樣為了弄清楚這些問題, 像標籤一樣,我們先找到它的解析類。第一篇文章中說過了,所有的自定義命名空間(像mvc,context等)下的標籤解析都是由beandefinitionparser介面的子類來完成的。參看第一篇文章中的
我們看到有多個annotationdrivenbeandefinitionparser,他們是用來處理不同命名空間下的標籤的,我們今天研究的是標籤,所以我們找到對應的實現類是org.springframework.web.servlet.config.annotationdrivenbeandefinitionparser。
通過閱讀類注釋文件,我們發現這個類主要是用來向工廠中註冊了
上面幾個bean例項。這幾個類都是用來做什麼的呢?
中間三個是用來處理請求的。具體點說就是確定呼叫哪個controller的哪個方法來處理當前請求。第乙個處理@controller註解的處理器,支援自定義方法引數和返回值(很酷)。第二個是處理繼承httprequesthandler的處理器。第三個處理繼承自controller介面的處理器。
後面三個是用來處理異常的解析器。
光說無憑據,我們直接看**:
public beandefinition parse(element element, parsercontext parsercontext)
if (argumentresolvers != null)
if (returnvaluehandlers != null)
if (asynctimeout != null)
if (asyncexecutor != null)
handleradapterdef.getpropertyvalues().add("callableinterceptors", callableinterceptors);
handleradapterdef.getpropertyvalues().add("deferredresultinterceptors", deferredresultinterceptors);
string handleradaptername = parsercontext.getreadercontext().registerwithgeneratedname(handleradapterdef);
//異常處理解析器
rootbeandefinition exceptionhandlerexceptionresolver = new rootbeandefinition(exceptionhandlerexceptionresolver.class);
exceptionhandlerexceptionresolver.setsource(source);
exceptionhandlerexceptionresolver.setrole(beandefinition.role_infrastructure);
exceptionhandlerexceptionresolver.getpropertyvalues().add("contentnegotiationmanager", contentnegotiationmanager);
exceptionhandlerexceptionresolver.getpropertyvalues().add("messageconverters", messageconverters);
exceptionhandlerexceptionresolver.getpropertyvalues().add("order", 0);
string methodexceptionresolvername =
parsercontext.getreadercontext().registerwithgeneratedname(exceptionhandlerexceptionresolver);
//異常處理解析器
rootbeandefinition responsestatu***ceptionresolver = new rootbeandefinition(responsestatu***ceptionresolver.class);
responsestatu***ceptionresolver.setsource(source);
responsestatu***ceptionresolver.setrole(beandefinition.role_infrastructure);
responsestatu***ceptionresolver.getpropertyvalues().add("order", 1);
string responsestatu***ceptionresolvername =
parsercontext.getreadercontext().registerwithgeneratedname(responsestatu***ceptionresolver);
//異常處理解析器
rootbeandefinition defaultexceptionresolver = new rootbeandefinition(defaulthandlerexceptionresolver.class);
defaultexceptionresolver.setsource(source);
defaultexceptionresolver.setrole(beandefinition.role_infrastructure);
defaultexceptionresolver.getpropertyvalues().add("order", 2);
string defaultexceptionresolvername =
parsercontext.getreadercontext().registerwithgeneratedname(defaultexceptionresolver);
parsercontext.registercomponent(new beancomponentdefinition(handleradapterdef, handleradaptername));
parsercontext.registercomponent(new beancomponentdefinition(exceptionhandlerexceptionresolver, methodexceptionresolvername));
parsercontext.registercomponent(new beancomponentdefinition(responsestatu***ceptionresolver, responsestatu***ceptionresolvername));
parsercontext.registercomponent(new beancomponentdefinition(defaultexceptionresolver, defaultexceptionresolvername));
mvcnamespaceutils.registerdefaultcomponents(parsercontext, source);
parsercontext.popandregistercontainingcomponent();
return
null;
}//在這啊。
public
static
void registerdefaultcomponents(parsercontext parsercontext, object source)
略長,但很容易看明白的**。看注釋我們發現,它的確註冊了上面說的那幾個類。
我們知道了它們自動為我們註冊了這麼多的bean,那這些bean是做什麼的呢?
第二個是handleradapter的實現類,它是處理請求的介面卡,說白了,就是確定呼叫哪個類的哪個方法,並且構造方法引數,返回值。(後面文章也會陸續詳細介紹的)
那麼它跟有什麼區別呢?其實想上篇文章中介紹的,標籤是告訴spring 來掃瞄指定包下的類,並註冊被@component,@controller,@service,@repository等註解標記的元件。
而是告知spring,我們啟用註解驅動。然後spring會自動為我們註冊上面說到的幾個bean到工廠中,來處理我們的請求。
springmvc中的靜態資源對映配置
web.xml配置 id taotao version 2.5 taotao sso index.html index.htm index.jsp default.html default.htm default.jsp contextconfiglocation org.springframewo...
springMVC中快速配置shiro
1.在web.xml檔案中配置shiro的過濾器,以攔截專案內的訪問 shirofilter org.springframework.web.filter.delegatingfilterproxy targetfilterlifecycle true shirofilter 2.在spring 的...
springMVC的檔案配置
之前有學習過springmvc框架,只知道他和struts框架一樣都是mvc框架,今天在再學習springmvc的時候學習到一些知識。在此分享出來,供自己記住。首先要使用springmvc框架,先導入其jar包,然後就是配置檔案 下面我來說一下springmvc的配置檔案 這裡主要牽扯2個重要的配置...