淺析SpringMVC中的適配器HandlerAdapter
DispatcherServlte的initHandlerAdapters方法根據(jù)配置文件信息把HandlerAdapter注冊(cè)到handlerAdapters(List)中。
如果在配置文件中沒(méi)有配置,默認(rèn)配置會(huì)讀取DispatcherServlte.properties文件,該文件中配置了三種HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter。
SimpleControllerHandlerAdapter :繼承Controller方式所使用的適配器 HttpRequestHandlerAdapter :HTTP請(qǐng)求處理器適配器 RequestMappingHandlerAdapter :注解方式(@Controller)的處理器適配器
getHandler方法根據(jù)請(qǐng)求遍歷注冊(cè)到handlerAdapters中的適配器拿到對(duì)應(yīng)的適配器處理。
for (HandlerMapping hm : this.handlerMappings) {
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
HandlerAdapter接口有三個(gè)方法:

supports方法:是判斷該適配器是否支持這個(gè)HandlerMethod,就是當(dāng)?shù)玫揭粋€(gè)handler時(shí),該接口子類該方法做判斷(就是類似handler instanceof Controller的判斷方式),用來(lái)得到適配這個(gè)handler的適配器子類。
handle方法:用來(lái)執(zhí)行控制器處理函數(shù),獲取ModelAndView 。就是根據(jù)該適配器調(diào)用規(guī)則執(zhí)行handler方法。
如果正常編寫(xiě)調(diào)用,就需要使用多個(gè)if else判斷instance of
if(handler instanceof HttpRequestHandler){
handle1();//HttpRequestHandler的處理方式
} else if (handler instanceof Controller){
handle2();//Controller的處理方式
} else if (handler instanceof Servlet){
handle3();//Servlet的處理方式
}
這種方法再添加新的處理器實(shí)現(xiàn)方式,就需要修改源碼,新增else添加處理邏輯,不符合對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉原則。使用了HandlerAdapter后,當(dāng)需要新增一種處理器(Controller)時(shí),只需要新增一個(gè)HandlerAdapter即可,判斷邏輯在他的supports方法中,處理邏輯在handle中,不需要修改任何其他代碼。
到此這篇關(guān)于淺析SpringMVC中的適配器HandlerAdapter的文章就介紹到這了,更多相關(guān)SpringMVC適配器HandlerAdapter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中將String轉(zhuǎn)換為char數(shù)組的三種方式
這篇文章主要介紹了三種將字符串轉(zhuǎn)換為字符數(shù)組的方法,分別是toCharArray()、charAt()和循環(huán)、getChars(),每種方法都有其適用場(chǎng)景和優(yōu)缺點(diǎn),需要的朋友可以參考下2024-12-12
Java選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)的使用詳解
循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)置的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán),選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果判斷某些條件,根據(jù)判斷的結(jié)果來(lái)控制程序的流程2022-03-03
Spring4.0 MVC請(qǐng)求json數(shù)據(jù)報(bào)406錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了Spring4.0 MVC請(qǐng)求json數(shù)據(jù)報(bào)406錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Map集合中獲取key-value值的實(shí)現(xiàn)方法
這篇文章主要介紹了Map集合中獲取key-value值的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
java協(xié)程框架quasar和kotlin中的協(xié)程對(duì)比分析
這篇文章主要為大家介紹了java協(xié)程框架quasar和kotlin兩個(gè)協(xié)程對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多基本2022-02-02
Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析
這篇文章主要為大家介紹了Map映射LinkedHashSet與LinkedHashMap的應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2022-03-03
SpringCloud整合OpenFeign實(shí)現(xiàn)微服務(wù)間的通信
微服務(wù)之間的通信?式,通常有兩種: RPC 和 HTTP,在SpringCloud中, 默認(rèn)是使?HTTP來(lái)進(jìn)?微服務(wù)的通信, 最常?的實(shí)現(xiàn)形式有兩種:RestTemplate和OpenFeign,本文給大家介紹了SpringCloud整合OpenFeign實(shí)現(xiàn)微服務(wù)間的通信,需要的朋友可以參考下2024-06-06

