91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HandlerAdapter適配器模式的源碼分析

發布時間:2021-10-20 17:52:37 來源:億速云 閱讀:145 作者:柒染 欄目:大數據

本篇文章為大家展示了HandlerAdapter適配器模式的源碼分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

SpringMVC中的HandlerAdapter適配器

什么是適配器模式

定義:將一個系統的接口轉換成另外一種形式,從而使原來不能直接調用的接口變得可以調用。

適配器模式應用場景

  • Mybatis多種日志框架的整合

  • SpringMVC適配器模式

  • 新老版本的兼容問題

SpringMVC適配器模式源碼分析

1、通過URL找到具體的請求方法

mappedHandler = this.getHandler(processedRequest);

HandlerAdapter適配器模式的源碼分析

HandlerAdapter適配器模式的源碼分析

在這里進行初始化三個適配器

HandlerAdapter適配器模式的源碼分析

HandlerAdapter適配器模式的源碼分析

先走父類

HandlerAdapter適配器模式的源碼分析

返回true

HandlerAdapter適配器模式的源碼分析

protected boolean supportsInternal(HandlerMethod handlerMethod) {
    return true;
}

拿到對應的適配器

HandlerAdapter適配器模式的源碼分析

HandlerAdapter接口看下所有適配器類型

HandlerAdapter適配器模式的源碼分析

下面看下這幾種適配器:

AbstractHandlerMethodAdapter implements HandlerAdapter

public final boolean supports(Object handler) {
    return handler instanceof HandlerMethod && this.supportsInternal((HandlerMethod)handler);
}

HttpRequestHandlerAdapter implements HandlerAdapter

public boolean supports(Object handler) {
    return handler instanceof HttpRequestHandler;
}

RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter

protected boolean supportsInternal(HandlerMethod handlerMethod) {
    return true;
}

SimpleControllerHandlerAdapter implements HandlerAdapter

public boolean supports(Object handler) {
    return handler instanceof Controller;
}

SimpleServletHandlerAdapter implements HandlerAdapter

public boolean supports(Object handler) {
    return handler instanceof Servlet;
}
  • 繼承Controller方式所使用的適配器:SimpleControllerHandlerAdapter

  • HTTP請求處理器適配器:HttpRequestHandlerAdapter

  • 注解方式(@Controller)的處理器適配器:RequestMappingHandlerAdapter

如果不采用適配器的話

If(hanlder instanceof Controller){

 // 執行Controller適配器
}

If(hanlder instanceof  HttpControler){

 // 執行我們的HttpController

}

If(hanlder instanceof  ServletControler){

 // 執行我們的HttpController

}

If(hanlder instanceof  AnnotationControler){

 // 執行我們的AnnotationController
}

簡單實現接口

@Controller("/httpRequestHandler")
public class ExtHttpRequestHandlerAdapter implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("httpRequestHandler");
    }
}

這個時候就會執行到HttpRequestHandlerAdapter適配器

模擬SpringMVC適配器模式

HandlerAdapter

public interface HandlerAdapter {
    /**
     * 根據hanlder判斷是那個HandlerAdapter類型 如果找到對應的類型話返回true */
    boolean supports(Object handler);
    /**
     * 執行我們的請求方法 */
    void handle(Object handler);
}

HandlerAdapter子類

public class AnnotationHandlerAdapter implements HandlerAdapter {
    /**
     * 注解形式的適配器 */
    public boolean supports(Object handler) {
        return (handler instanceof AnnotationController);
    }

    public void handle(Object handler) {
        ((AnnotationController) handler).hanlder();
    }
}
public class HttpRequestHandlerAdapter implements HandlerAdapter {
    /**
     * Http類型 適配器 */
    public boolean supports(Object handler) {
        return (handler instanceof HttpController);
    }

    public void handle(Object handler) {
        ((HttpController) handler).hanlder();
    }
}

Controller

public interface Controller {//請求方法void hanlder();
}

Controller子類

public class AnnotationController implements Controller {
    public void hanlder() {
        System.out.println("AnnotationController");
    }
}
public class HttpController implements Controller {
    public void hanlder() {
        System.out.println("HttpController");
    }
}

DispatcherServlet

public class DispatcherServlet {
    private List<HandlerAdapter> handlerAdapters;

    public DispatcherServlet() {
        handlerAdapters = new ArrayList<HandlerAdapter>();
        handlerAdapters.add(new HttpRequestHandlerAdapter());
        handlerAdapters.add(new AnnotationHandlerAdapter());
    }
    public void dispatcher() {        // 1. 已經獲取到hanlderAnnotationController hanlder = new AnnotationController();    // 2.獲取具體適配器HandlerAdapter handlerAdapter = getHandlerAdapter(hanlder);        // 3.執行我們的請求方案handlerAdapter.handle(hanlder);
    }
    public HandlerAdapter getHandlerAdapter(Controller controller) {
        if (this.handlerAdapters != null) {
            for (HandlerAdapter ha : this.handlerAdapters) {

                if (ha.supports(controller)) {
                    return ha;
                }
            }
        }
        return null;
    }
    public static void main(String[] args) {
        new DispatcherServlet().dispatcher();
    }
}

上述內容就是HandlerAdapter適配器模式的源碼分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遵义市| 永顺县| 肇庆市| 广元市| 井陉县| 庆安县| 宜昌市| 共和县| 大荔县| 澳门| 玛纳斯县| 安福县| 乌拉特前旗| 左权县| 大荔县| 即墨市| 南漳县| 乌兰察布市| 铜山县| 寿阳县| 汝南县| 义马市| 宜兰市| 三台县| 涞源县| 夹江县| 房产| 洪湖市| 屯门区| 汕尾市| 北京市| 昆明市| 三原县| 五峰| 连江县| 左贡县| 营口市| 黄石市| 广德县| 莱芜市| 介休市|