成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

阿里面試:看過框架源碼嗎?舉例說明一下

開發 前端
開源框架的源碼在面試中經常會被問到,但只因如此,就去完整的看某個框架的源碼,其實還是挺難的。第一,框架中的源碼很多,很難一次性看懂。第二,即使能看懂,看完之后也會很快忘記(因為內容太多了)。此時,不如挑一些框架中的經典實現源碼來看,其性價比更高,既能學到框架中的精髓,又能搞定面試,是一個不錯的選擇。

前兩天有朋友面試“淘汰集團”,也就是“淘寶”+“天貓”的組合,最后被面試官問到了這道題:“你看過哪些開源框架的源碼?舉例說明一下”。

誠然,這是一道比較考驗應聘者基本功的問題,也是很好區分“好學生”和“普通學生”的一道經典的開放性問題。

那這個問題應該怎么回答呢?

解答思路

我這給大家提供兩個思路吧:

  1. 可以回答比較常見的,你比較熟悉的源碼,例如 Spring Boot 收到請求之后,執行流程的源碼。
  2. 還可以回答 Spring Cloud 微服務中,某個組件執行的流程源碼,這樣能很好的體現你對微服務比較熟悉,因為微服務在公司中應用比較廣泛,所以回答的好,是一個極大的加分項。

1.Spring Boot 源碼分析

Spring Boot 在收到請求之后,會先執行前端控制器 DispatcherServlet,并調用其父類 FrameworkServlet 中的 service 方法,其核心源碼如下:

/**
 * Override the parent class implementation in order to intercept PATCH requests.
 */
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
    if (httpMethod == HttpMethod.PATCH || httpMethod == null) {
        processRequest(request, response);
    } else {
        super.service(request, response);
    }
}

繼續往下看,processRequest 實現源碼如下:

protected final void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 // 省略一堆初始化配置
   
   try {
       // 真正執行邏輯的方法
       doService(request, response);
   }
   catch (ServletException | IOException ex) {
       ...
   }
}

doService 實現源碼如下:

protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws Exception;

doService 是抽象方法,由其之類 DispatcherServlet 來重寫實現,其核心源碼如下:

@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 省略初始化過程...
    try {
        doDispatch(request, response);
    }
    finally {
  // 省略其他...
    }
}

此時就進入到了 DispatcherServlet 中的 doDispatch 方法了:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 獲取原生請求
    HttpServletRequest processedRequest = request;
    // 獲取Handler執行鏈
    HandlerExecutionChain mappedHandler = null;
    // 是否為文件上傳請求, 默認為false
    boolean multipartRequestParsed = false;
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        try {
            // 檢查是否為文件上傳請求
            processedRequest = checkMultipart(request);
            multipartRequestParsed = (processedRequest != request);
            // Determine handler for the current request.
            // 獲取能處理此請求的Handler
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            // Determine handler adapter for the current request.
            // 獲取適配器
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            // Process last-modified header, if supported by the handler.
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            // 執行攔截器(鏈)的前置處理
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            // 真正的執行對應方法
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
            applyDefaultViewName(processedRequest, mv);
            mappedHandler.applyPostHandle(processedRequest, response, mv);
        }
        // 忽略其他...
}

通過上述的源碼我們可以看到,請求的核心代碼都在 doDispatch 中,他里面包含的主要執行流程有以下這些:

  1. 調用 HandlerExecutionChain 獲取處理器:DispatcherServlet 首先調用 getHandler 方法,通過 HandlerMapping 獲取請求對應的 HandlerExecutionChain 對象,包含了處理器方法和攔截器列表。
  2. 調用 HandlerAdapter 執行處理器方法:DispatcherServlet 使用 HandlerAdapter 來執行處理器方法。根據 HandlerExecutionChain 中的處理器方法類型不同,選擇對應的 HandlerAdapter 進行處理。常用的適配器有 RequestMappingHandlerAdapter 和 HttpRequestHandlerAdapter。
  3. 解析請求參數:DispatcherServlet 調用 HandlerAdapter 的 handle 方法,解析請求參數,并將解析后的參數傳遞給處理器方法執行。
  4. 調用處理器方法:DispatcherServlet 通過反射機制調用處理器方法,執行業務邏輯。
  5. 處理攔截器:在調用處理器方法前后,DispatcherServlet 會調用攔截器的 preHandle 和 postHandle方法進行相應的處理。
  6. 渲染視圖:處理器方法執行完成后,DispatcherServlet 會通過 ViewResolver 解析視圖名稱,找到對應的 View 對象,并將模型數據傳遞給 View 進行渲染。
  7. 生成響應:View 會將渲染后的視圖內容生成響應數據。

2.Spring Cloud 源碼

Spring Cloud 組件有很多,你可以挑一個源碼實現比較簡單的組件來講,這里推薦 Spring Cloud LoadBalancer,因為其核心源碼的實現比較簡單。

Spring Cloud LoadBalancer 中內置了兩種負載均衡策略:

  1. 輪詢負載均衡策略
  2. 隨機負載均衡策略

輪詢負載均衡策略的核心實現源碼如下:

// ++i 去負數,得到一個正數值
int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;
// 正數值和服務實例個數取余 -> 實現輪詢
ServiceInstance instance = (ServiceInstance)instances.get(pos % instances.size());
// 將實例返回給調用者
return new DefaultResponse(instance);

隨機負載均衡策略的核心實現源碼如下:

// 通過 ThreadLocalRandom 獲取一個隨機數,最大值為服務實例的個數
int index = ThreadLocalRandom.current().nextInt(instances.size());
// 得到實例
ServiceInstance instance = (ServiceInstance)instances.get(index);
// 返回
return new DefaultResponse(instance);

小結

開源框架的源碼在面試中經常會被問到,但只因如此,就去完整的看某個框架的源碼,其實還是挺難的。第一,框架中的源碼很多,很難一次性看懂。第二,即使能看懂,看完之后也會很快忘記(因為內容太多了)。此時,不如挑一些框架中的經典實現源碼來看,其性價比更高,既能學到框架中的精髓,又能搞定面試,是一個不錯的選擇。

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2010-03-04 13:21:32

linux壓縮命令

2013-11-26 11:08:23

Linux命令diff

2018-11-28 08:20:15

Linuxalias命令

2010-06-22 13:08:42

Linux At命令

2009-09-25 09:30:33

Hibernate持久

2010-01-12 15:56:25

C++軟件

2010-01-18 17:31:54

C++編寫程序

2010-06-18 10:24:51

Linux acces

2010-01-21 09:53:23

C++操作符

2010-03-03 10:55:39

2010-01-06 16:54:07

.Net Framew

2009-12-07 17:28:55

WCF數據

2010-01-08 17:06:52

C++代碼

2010-03-04 13:45:37

Linux壓縮命令

2021-01-28 10:23:26

Seata模式分布式

2023-11-29 08:00:53

JavaTreeMap底層

2010-04-09 16:52:36

Unix操作系統

2010-01-20 10:19:16

VB.NET動態接口

2010-09-24 17:39:28

SQL中EXISTS

2010-01-06 10:35:02

Json_Decode
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人免费在线 | 国产精品一级在线观看 | 国产精品电影在线观看 | 欧美视频三区 | 成人在线视频免费看 | 欧美性高潮 | 日韩精品一区二区三区四区 | 国产乱码精品1区2区3区 | 欧美 日韩 国产 成人 在线 91 | 欧美福利视频一区 | 久久男人 | 羞羞视频网页 | 欧美一区二区二区 | 97国产精品 | 午夜影晥 | 国产高清精品一区 | 九九爱这里只有精品 | 免费观看视频www | caoporn视频在线 | 亚洲精品电影在线观看 | 玖玖爱365 | 欧美激情一区二区三区 | 久久伊人影院 | 天堂在线网 | 成年人在线视频 | 亚洲精品电影网在线观看 | 国产精品日日做人人爱 | 天天夜天天操 | 91精品国产综合久久久久久首页 | 四虎影| 国产a区 | 久久这里有精品 | 午夜激情影院 | 爱爱视频日本 | 国产小视频在线看 | 黑人巨大精品欧美一区二区免费 | 欧美精品区| 中文精品视频 | www国产成人免费观看视频,深夜成人网 | www.午夜| 久久久久网站 |