2019年3月24日阿里菜鳥網絡一面總結

剛開始肯定是一貫的自我介紹,小小的211沒什麼可多介紹的。就說了名字,java學得還行,自己做過兩個項目然後balabala…一段時間,問我喜歡做前端還是做後端,無語- -,簡歷寫的不夠清楚嘛,我說了後端,然後開始正式面試。

1.說下Spring-MVC由哪些部分組成,實現什麼功能,結合你的項目說下具體流程。Model, view,Controller…

我說spring-mvc是基於java得實現了MVC設計模式得得請求驅動類型得輕量級Web框架,主要有三部分,Model層,視圖層,以及控制器層組成。以一個查詢功能爲例子說明了這一個過程(emmm感覺表達能力不太行,說得有點亂)。
附上:Spring-MVC的執行過程以及圖片。
(1)用戶發送請求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到請求後,調用HandlerMapping處理器映射器,請求獲取Handle;
(3)處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet;
(4)DispatcherServlet 調用 HandlerAdapter處理器適配器;
(5)HandlerAdapter 經過適配調用 具體處理器(Handler,也叫後端控制器);
(6)Handler執行完成返回ModelAndView;
(7)HandlerAdapter將Handler執行結果ModelAndView返回給DispatcherServlet;
(8)DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進行解析;
(9)ViewResolver解析後返回具體View;
(10)DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)
(11)DispatcherServlet響應用戶。

在這裏插入圖片描述

2.說一下Spring-MVC框架的Ioc(依賴注入)以及AOP(面向切面)。

Ioc是依賴注入,以往調用者要使用某個調用者對象時,需要自己new一個被調用者對象,這個過程往往是每個要實現功能的調用者都要去執行這個操作。這不但增加了系統的耦合度還增加了程序員編寫代碼的負擔同時還增加了系統的可維護度以及後期系統的可擴展性。現在通過引入spring框架,其通過控制反轉實現了鬆散耦合,對象們給出他們的依賴,而不是創建和查找對象的依賴的對象們。以後調用者需要某個依賴的對象時,有spring容易創建並交給調用者,由此實現了控制翻轉。

AOP是面向切面編程,並且把應用的業務邏輯和系統服務分開。也就是說系統的多個功能模塊的實現過程可能有相同的服務過程,例如,日誌管理,系統緩存等。通過AOP可以將這些大家都有的功能結合到一起,通過AOP的動態代理(哭了,那好說下動態代理)去實現這些共有的系統服務,並且是可以在所有的系統功能均採用動態代理的方式來實現切面編程。

3.Spring Aop的動態代理

靜態AOP 靜態織入 在編譯期,切面直接以字節碼的形式編譯到目標字節碼文件中 對系統無性能影響 靈活性不夠
動態AOP 動態代理 在運行期,目標類加載後,爲接口動態生成代理類,將切面織入到代理類中 相對於靜態AOP更加靈活
切入的關注點需要實現接口。對系統有一點性能影響

靜態代理:由程序員創建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了

動態代理:即在運行期動態創建代理類,使用動態代理實現AOP需要4個角色:

被代理的類:即AOP裏所說的目標對象
被代理類的接口
織入器:使用接口反射機制生成一個代理類,在這個代理類中織入代碼
InvocationHandler切面:切面,包含了Advice和Pointcut

4.說一下快速排序的原理用僞代碼的形式描述一遍。

(1)分解:以a[i]爲基準元素,先從右向左掃描,比基準元素大的不改變位置,如果比基準原素小則與基準元素調換位置。然後在從左向右掃描,比基準元素小的不換位置否則與基準元素調換位置。這一頓操作之後便可以完成一趟快速排序,將數字序列分成a[p,q-1],a[q],a[q+1,r]這三個部分。且a[q]之前的元素都小於a[q]而a[q]之後的元素均大於a[q]得值。
(2)遞歸求解,通過遞歸的調用快速排序算法,分別對a[p,q-1]以及a[q+1,r]進行排序。
(3)當(2)中的兩個子序列都排好序後,不需要任何的操作,整個序列a[p,r]就排好序。
僞代碼:


   void quicksort(int left,int right) 
  { 
      int i,j,t,temp; 
      if(left>right) 
         return;                        
      temp=a[left]; //temp中存的就是基準數 
      i=left; 
      j=right; 
      while(i!=j) 
      { 
                     //順序很重要,要先從右邊開始找 
                     while(a[j]>temp && i<j) 
                              j--; 
                     //再找zuo邊的 
                     while(a[i]<=temp && i<j) 
                              i++; 
                     //交換兩個數在數組中的位置 
                     if(i<j) 
                     { 
                              t=a[i]; 
                              a[i]=a[j]; 
                              a[j]=t; 
                     } 
      } 
      //最終將基準數歸位 
      a[left]=a[i]; 
      a[i]=temp;          
      quicksort(left,i-1);//繼續處理左邊的,這裏是一個遞歸的過程 
      quicksort(i+1,right);//繼續處理右邊的 ,這裏是一個遞歸的過程 
  } 

5.問你一個java得知識說說 synchronized 和 volatile 的區別是什麼?

volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取; synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的。volatile僅能實現變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化。

6.你想參與阿里的哪個業務部門?

(emmm其實我也不知道,所以所以說只要是後端的都可以把。。。。。。)
感覺自己回答得不好,有些知識已經看過了可是說的時候還是吞吞吐吐,還需要多鍛鍊。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章