1. 程式人生 > >網易面試彙總

網易面試彙總

專案經歷

第一步:先介紹為什麼做這個專案,目的是什麼?給誰用?解決了使用者什麼問題?行業背景是什麼?
第二步:有哪些模組?主要的業務流程?
第三步:用到哪些技術?
第四步:你負責的那一部分的流程、技術?

注意:最多詳細的介紹3個專案,每介紹一個涉及的技術點有哪幾點心裡亮敞敞的,說出個一二三,最好說的他燒腦。

  1. 抽象類和介面的區別
  2. 抽象類內方法如果全部是抽象的,是不是就是介面?為什麼有的類繼承一個類後,還要實現多個介面?
  3. 多執行緒中,執行緒池用過哪些執行緒池?
  4. 執行緒池中所有的引數講解一下
  5. 執行緒池中從corePoolSize到maximumPoolSize轉變過程,然後一直問我反向轉變的操作(多執行緒併發:就是併發量突然降低了,這個過程怎麼實現的,引數如何變化)
  6. HTTP傳送請求和接收響應的整個流程;
  7. 403和500狀態分別講解一下,他們之間有什麼區別;
  8. 淘寶裡如果按照1-5星的店面,從五家店裡一共推送出10個同一類產品,都是隨機推送,但是最後大量的隨機測試後,要保證五顆星的店家推送的商品數量大概是一顆星店家推送的商品數量的五倍,且不能破壞其他概率輸出(思維能力:這個問題跟他討論了有10幾分鐘,最後他問我有沒有優化。。。我哪知道怎麼優化)
  9. 一個已知儲存了資料的HashMap中如何讓所有的鍵修改成”網易+原來的鍵”,意思是在所有的key中新增”網易”這個字首。(Java核心技術:我說迭代處理,但是會有fail-fast問題,然後我就瞎扯了同步操作一下)
  10. spring的AOP原理和底層實現(框架技術:扯了一下概念和反射機制)

  11. Spring的註解講一下;(框架技術)

  12. 靜態代理和動態代理區別講一下;

  13. 靜態代理和介面卡設計模式的區別;
  14. tcp和udp的區別;(計算機網路知識:就從可靠性,通訊方式,資料大小,應用方面說了說)

  15. cglib底層實現;(框架技術:懵逼)

  16. 資料庫的樂觀鎖原理和實現;

  17. 資料庫索引的設計原理以及意義

  18. 接著上面的問題,問了給定一個數據庫,如何設計索引,有什麼要注意的?

  19. 給定淘寶秒殺場景,請設計系統實現秒殺(思維能力:又是淘寶,我就說了一下多執行緒,生產者消費者也扯上去了,他說是多節點實現,其實我沒聽明白他想讓我說啥。。。)

  20. 微博粉絲和關注者,以及使用者資訊,請實現資料庫表,來關聯起這些表(資料庫:我畫圖,然後講了一下,問我有沒有優化,我說想不出來)

  21. 針對我設計的表,進行查詢操作,問我所有的表查詢完後,多少次操作。(資料庫)

  22. 之前實習的做了什麼專案?講解一下。

  23. 就著專案,提出海量資料的時候,集合存不下怎麼辦(Java核心技術:我實在想不到方法,就說了一下把檔案進行分割然後再存集合裡。)

  24. 資料庫裡的事務原理講一下;(資料庫:我就扯了一下隔離級別以及髒讀,不可重複讀以及幻讀中事務的問題

  25. 手寫jdbc連線資料庫的程式碼(Java核心技術:真心記不得了,只記得流程和類,直接寫了一堆註釋上去)

  26. 資料庫的事務特性有哪些?

  27. 課題講一下做的什麼;

  28. 通訊是偏軟體還是硬體?為什麼學Java(聽到這個我就有點崩潰了,依據我的直覺,gg了)(職業發展規劃) 最後問我有什麼要問的?(提問環節:我真想問問他是不是搞資料庫的,大部分都是資料庫,虐死。。最後就問了兩個小問題,讓我回到前臺那邊等通知

  29. 準備 9大排序,3大查詢

  30. 時間複雜度和空間複雜度

    1. 32.
  31. java的多執行緒、IO操作、集合框架

    1. HashMap和TreeMap

    1. 集合框架
  32. I/O流操作的。給出了四種情況,然後使用I/O流體系內提供的類寫出正確的實現組合。題目提供了很多操作流的類,我不一一寫出了,附上一張網上找的圖片。
    實現序列化介面Serialize的時候,如果不指定serialVersionUID 的值,編譯時就會出現警告,為什麼?什麼情況下需要修改serialVersionUID 的值?

一個系統有多個定時任務,設計一種資料結構用來儲存這些任務。考慮定時任務的新增、刪除和觸發。有10000個任務的時候,分析這種資料結構的效能。(大概是這樣的意思)。

java集合框架繼承體系(如map介面、Set介面、list介面),答上了
Set的原始碼與hashMap的原始碼
java NIO
java併發,如java中的鎖有什麼
java快取(接觸的少)
java I/O庫(用的也少)
mysql中的索引(要詳細理解)
最近在學習什麼技術
個人感覺知識不要侷限在某個方面,要多瞭解資料庫與實際專案的應用及遇到的問題,這點很重要。
開始問Java相關的東西,感覺忘記了很多,也是mysql的索引,hashSet原始碼,感覺他們似乎對mysql索引,set集合用的很多。
再者用三句話描述下spring框架的原理與作用(相當於向一個不懂spring框架的人介紹spring),近期研究spring基本原理,並沒有深入,但作用與原理還是明白的,我回答的是“利用java反射來管理Bean”,應該是正確的,面試官並沒有說什麼。
如果不讓你用Java Jdk提供的工具,你自己實現一個Map,你怎麼做。
說了好久,說了HashMap原始碼,如果我做,就會借鑑HashMap的原理,說了一通HashMap實現
2、Hash衝突怎麼辦?
還是HashMap的陣列加連結串列機制
3、HashMap衝突很厲害,最差效能,你會怎麼解決
從O(n)提升到log(n)咯,用二叉排序樹的思路說了一通
4、你的專案用的什麼結構,為什麼這麼用,主要考慮解決什麼問題?
以為又要說道專案,效能什麼的,心裡一緊。說吧。哼。然後用筆畫了系統架構草圖,主要從可擴充套件性、及安全性兩方面說了一通。
5、你對mysql熟悉嗎?說說mysql索引如何建立的
從b樹說到b-樹,然後重點說了b+樹,畫了草圖。讓面試官覺得自己知道挺多的樣子,其實我們這些菜鳥面對這些大牛,哎,真的什麼都不算哦
6、 對IO瞭解嗎?String 編碼UTF-8 和GBK的區別
當然說了解,基本功好伐。什麼位元組流、字元流、各種介面實現類。方法阻塞……
7、 什麼時候使用位元組流、什麼時候使用字元流
根據自己現在寫的《一卡通小額支付藉口》ISO8583報文隨便聊了下,答的很不好。
8、瞭解設計模式嗎?
說了一堆:單例、工廠、觀察者、介面卡、門面……
9、介面卡模式的類圖知道嗎?
(哎,這個忘記了)回答的是:不記得,按照我現在對介面卡模式的理解,類圖應該這樣這樣……(又來了一個草圖,感覺自己真的是厚顏無恥啊,在大牛面前不懂還裝B)
10、JVM有了解嗎,可以說說嗎?
自己從classload 載入方式,載入機制說開去,從程式執行時資料區,講到記憶體分配,講到String常量池,講到JVM垃圾回收機制,演算法,hotspot。反正就是各種擴充套件
11、你覺得你還有哪裡比較擅長,在這次面試中沒有聊起來的嗎?
這 這這,我心裡想,在你這大牛面前,怎敢提擅長兩個字啊。然後弱弱的說了一句“SSH框架都有用過”——這下好了,把SSH技術原理都說了一通。 Struts2的原理體系架構啊,IoC啊,過濾器啊,攔截器啊。Hibernate的原理體系架構啊,五大核心介面啊,Hibernate物件的三種狀 態轉換啊。Spring的IoC、AOP啊,事務管理啊。
39. 分鐘。
40. 1、 簡單自我介紹一下
41. (幹嘛又是介紹)從本科 到 研究生 學校、專業、保送、什麼什麼的(所有的自我介紹全部沒有說自己的獲獎情況啊什麼的)
42. 2、 說說專案情況
43. (哎,又是專案)重點強調了一下專案基本都在線上執行,目前正在開發的專案,擔任任專案經理(雖然團隊很小)
44. 3、 你這個專案(特指正在開發的這個)從需求分析調研到編碼的一個過程是什麼樣子的?
45. 木有需求調研,需求是部門經理已經和客戶聊好的。編碼就是系統搭建、考慮可擴充套件性、安全性,再詳細我也沒說了。
46. 4、 你是從哪裡瞭解到我們公司招聘資訊的?
47. (從這裡開始要引入室友和阿里巴巴offer的故事了)從牛客網上跟進連結的,很大程度上是因為室友提前參加阿里巴巴內推面試,自己才開始重視起來。但是還是因為自己沒寫過簡歷,癟了好久錯過了阿里內推簡歷投遞視窗(當然不是這樣直接說的咯,簡單的修飾了一下,不過思路是這樣的)。因為提到了阿里接下來就問:
48. 5、 你室友參加了我們的招聘嗎?說說你對阿里和網易的公司文化和產品的理解吧。
49. 從阿里文化和產品,網易文化和產品說開去。。。。(在我印象中,這是在我講完後唯一被面試官直接用語言認同了的,她的回覆是:“恩,你說的這幾點挺對的”)。
50. 6、 你覺得你更喜歡哪一種工作環境。
51. 當然是網易啊,當然也不能說阿里不好咯,網際網路的半壁江山可都是阿里的啊。
52. 所以主要是從自己的性格去說的。。。。
53. 7、 你的性格挺適合做專案經理或者產品經理的,為什麼你會投一個Java後臺開發崗位?
54. (這個被問的稀裡糊塗的,在我的理解中,專案經理、產品經理不是要先做程式設計師的麼?不懂啊~,還是裝懂,回答了下)從自己性格說道自己性格比較內向啦,喜歡駕馭完全按照自己意志執行的電腦啦,一臺電腦就是天下啦(bug除外啊,哈哈哈),和人溝通比較困難啦,什麼什麼的。
8、如果公司有個刺頭,比較不能和人溝通,你會怎麼相處
55. 這個好像說了句“如果持續存在意見相左,我會尊重他的想法,但同時也會保留自己的意見,選擇包容,因為每個人都有每個人的想法,沒有人會按照你的想法生活,我想我對我自己這一點包容還是很自信的”。(接下來重點來了啊)
56. 9、 你期望的薪資是多少?
57. (這個我會貿貿然的說嗎?哈哈,太小瞧我了)從自己是個畢業生,沒有獲得過其他公司的offer,對自己的能力進行評級說起(語氣重點說了下,網易是我投的第一份簡歷,第一家公司啊,這個當然是真的咯,我會亂說?),然後再說自己的能力沒有參考標準(開始要引出室友牛逼哄哄的阿里offer了)沒辦法給出一個具體的數字。然後就開始說:室友瞭解到的阿里去年薪資水平啊,自己和室友能力大致的比較啊(HR問了我對阿里薪資的瞭解,才說道這裡。其實潛臺詞是,給我20W+吧,如果可以的話。哎,臉皮真厚,只是說的比較委婉)。
58. PS:天哪裡曉得阿里今年是降薪不是加薪,室友心都傷透了,可是還是待阿里如初戀啊。這個是面試結束返回學校之後才知道的啦
HR:這個薪資網易提供的也差不多,不過我們每個月可能發不了這麼多,但是我們比阿里發的月數要多。誰還關心月薪啊,重點是自己一年能拿到多少錢。。。然後巴拉巴拉的說了一通阿里和網易的對比。
HR:你有什麼要問我的嗎?
“如果有幸被貴公司錄用,我想了解一下貴公司對應屆生的學習環境及員工晉升通道是什麼樣的?”(問的是不是好有逼格,我是覺得挺有逼格的,我是一個愛學習,有上進心的90後啦)
HR:開始介紹學習啊,評級啊P3-P5啊,股權啊,然後順便和阿里進行一通對比啊。
好啦,面試正式結束。
拿起手機,撥號,嘟……嘟……嘟……
我:寳寳,面試結束了
BB:棒棒噠~
……
……
……
PS:女朋友陪我一起去杭州參加的現場面。其中有個小插曲:剛來杭州濱江,不熟悉,誤入阿里大門,被門衛攔下,沒有工作證,被趕了出來。原來網易就在隔壁,之後女朋友死活不去網易大門口,在外面爆嗮了一下午,回校黑了一圈,差點脫皮,心疼死了。濱江這個地方,應該是新開發的吧,周圍啥也沒有看到。其實網易也要出示工作證的啦,我有面試郵件通知,放行。
來幾張現場照收尾
作者:yibeitang
連結:https://www.nowcoder.com/discuss/2821
來源:牛客網
先總結: 個人研究生生涯投出的第一份簡歷、第一個電面、第一個現場面。。。。。所有的,都是第一次。從8.12號投簡歷到9.3拿到offer,前前後後, 一共只花了20天的時間,不得不說網易的內推效率就是高(室友拿到了阿里的offer,那時間長的啊。 因為 自己簡歷憋不出來, 內推不積極, 錯過了阿里內推投簡歷的機會。)。回想一下,一切都很順利,運氣很好。感謝網易對我的認可!
現在才來寫,只是無聊,一開始沒打算記錄什麼,只因女朋友又生我氣了(哎,我是個SB),一個人呆在實驗室,好難受。沒啥事可幹,本來想敲會程式碼的,實在沒情緒啊!好吧,開始進入主題:

一、電面(電面一共17分鐘,之所以印象深刻,是掛掉電話就看了一下時間,當時看到時間就感覺沒戲了,怎麼才說這麼點時間,室友的一面可是一個多小時啊,這回完蛋了)。
1、自我介紹(這個一般都少不了吧)
說了一下自己是XXX學校XXX學院XXX專業的研究生咯,巴拉巴拉……
2、重點介紹一下專案情況
我自己在簡歷上寫了五個專案,3個 已 線上執行的,一個半科研半專案的不倫不類未成形的,一個正在開發當中的電商網站。然後逐個介紹咯!貌似這裡就花了我10 分鐘的時間(其實絕大多數時間都是自己在巴拉巴拉說個不停,面試官一直在“嗯,嗯,嗯”的迴應,估計只是告訴我他在聽)。
3、說說你知道的幾個Java集合類
自己說了一堆,從list、set、queue、map實現類咯。。。
4、描述一下ArrayList和LinkedList的區別
挺簡單的吧
5、實現多執行緒有幾種方式,多執行緒同步怎麼做,說說幾個執行緒裡常用的方法
最後一個沒回答就這麼過了,當時估計腦子短路,沒聽懂他在說什麼
6、說說mysql的索引,索引如何建立
就是b+樹咯
7、Spring用的怎麼樣,看過原始碼嗎?
(原始碼還真沒看過)
8 、瞭解AOP嗎?說說AOP原理,Spring如何實現AOP的
Spring兩大核心咯IoC、AOP 這個還是要會的吧
電面現在貌似就只想的起來這麼幾個問題。

二、現場面(現場面一共分了3面,2個技術面,1個HR面)
面試環境挺好,一對一,一開始以為自己會像電面時緊張的說話都打哆嗦(電面全程打哆嗦說完的,也不只怎麼的,就是慌)。坐下來後面對面的開始聊技術,整個過程一點都不緊張。自我感覺一次比一次聊的開,一次比一次聊的滿意。PS:每面一次,會刷掉一小波人,如果沒有通過一輪面試,大概兩分鐘後,引導員就會喊你 的名字,告訴你一句:”你好,你今天的面試已經結束了,你可以回家了。“(別問我怎麼知道的,一面面完,大家都在等下一步通知時,閒聊知道的)

一、技術面
全部以自己寫的專案為主,重點談效能優化,效能瓶頸,這個自我感覺最不好了,自己寫的小屁專案,哪有效能測試,壓力測試,大面積併發啊大概30-40分鐘左右吧
1、先簡單介紹一下你的專案吧
本來打算繼續按照電面的時候一個一個按照簡歷上的順序講的,剛開始講兩句,就被打斷說面試時間不多,挑兩個講。講完專案的大致情況,真正是才剛開始啊,然後就被問的各種懵逼啊,現在想想,挺佩服自己能扯的。
2、你的專案中使用過快取機制嗎?又沒用使用者非本地快取
用過快取,但是沒用過非本地 獨立 快取啊。然後就開始了一路扯淡的過程
3、”專案“(我自己寫的專案)有沒有考慮過大面積併發的情況
我的回答是沒有,
4、然後他就接下來問:”如果出現大面積併發,在不增加伺服器的基礎上,如何解決伺服器響應不及時問題“。
開始效能調優了。
5、假如你的專案出現效能瓶頸了,你覺得可能會是哪些方面,怎麼解決問題。
首先想到的是 自己的專案系統架構支援可擴充套件, 增加伺服器
然後優化程式碼咯,試試記憶體洩露啊什麼,然後開始坎java的 強 引用、軟引用、弱引用什麼
接著說了下可能會因為同步粒度大什麼之類的。。。。這個真心不怎麼會啊
6、如何查詢 造成 效能瓶頸出現的位置,是哪個位置照成效能瓶頸。
現在都忘記當時怎麼回答了,就大致記得沿著loadrunner說了一通
(插一句,其中還聊到自己的一個穿戴式裝置專案,自己又巴拉巴拉說了一通。面試官說一句:”這個不是Java的專案吧“;我說:”是的,是用微控制器C寫的“。面試官臉都不高興了,哈哈哈。。。。。)

1、專案結構。
沒有緩和的時間,面試官直接問我簡歷上某個專案的情況,簡要的說了下算是緩解心情,問了下使用的相關的技術,比如用了spring mvc框架沒 資料庫是用的什麼 這些可能就是面試官給的緩和時間吧,但是,我是這樣越緩和越緊張了,悲催。。。
2、用過mybatis沒?因為沒怎麼用過,所以面試官就沒怎麼問了。。。
3、集合框架hashtable、hashmap、list、list初始化大小、hashmap自動增長
答:一開始是直接問了解常用的集合框架麼,這個一聽到肯定說了解咯,於是就讓說說hashtable、hashmap、list的區別,所以就大致展開說了下:
ArrayList和Vector的區別:
共同點:這兩個類都實現了List介面(List介面繼承了Collection介面),他們都是有序集合,即儲存在這兩個集合中的元素的位置都是有順序的,相當於一種動態的陣列,我們以後可以按位置索引號取出某個元素,並且其中的資料是允許重複的,這是與HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重複的元素。
接著說ArrayList與Vector的區別,這主要包括兩個方面:.
同步性:Vector是執行緒安全的,也就是說是它的方法之間是執行緒同步的,而ArrayList是執行緒序不安全的,它的方法之間是執行緒不同步的。如果只有一個執行緒會訪問到集合,那最好是使用ArrayList,因為它不考慮執行緒安全,效率會高些;如果有多個執行緒會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫執行緒安全的程式碼。
注意:這裡談到執行緒安全,同步問題,面試官少不了會多嘴說一句,讓你講講執行緒安全是咋回事,如果不考慮,你聽到這個問題估計會是一臉懵逼,我當初就是這樣子的!所以這裡我補充下執行緒安全的問題: java中的執行緒安全就是執行緒同步的意思,就是當一個程式對一個執行緒安全的方法或者變數進行訪問的時候,其他的程式不能再對他進行操作了,必須等到這次訪問結束以後才能對這個執行緒安全的方法進行訪問,否則將會造成錯誤發生;執行緒安全就是說,如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。 執行緒安全問題都是由全域性變數及靜態變數引起的,定義在方法內部的區域性私有變數是沒有執行緒安全與否一說的。
備註:對於Vector&ArrayList、Hashtable&HashMap,要記住執行緒安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是執行緒安全的,ArrayList與HashMap是java2時才提供的,它們是執行緒不安全的。所以,我們講課時先講老的。
資料增長:ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的個數超過了容量時,就需要增加ArrayList與Vector的儲存空間,每次要增加儲存空間時,不是隻增加一個儲存單元,而是增加多個儲存單元,每次增加的儲存單元的個數在記憶體空間利用與程式效率之間要取得一定的平衡。Vector預設增長為原來兩倍,而ArrayList的增長策略在文件中沒有明確規定(從原始碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設定初始的空間大小,Vector還可以設定增長的空間大小,而ArrayList沒有提供設定增長空間的方法。
總結:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。 PS:因為在上面講區別的時候提到了自動增長的問題,所以面試官順帶問了句,hashmap自動增長為多少,這個問題說實話,自己沒有關注過,平時也沒注意過,所以只能老實的說不知道咯,面後網上查了下,不確定是否正確,有說1.6版本的是增長2倍!
ArrayList,Vector, LinkedList的儲存效能和特性:
ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差,而LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。LinkedList也是執行緒不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆疊和佇列來使用。
List和Map的區別:
一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,List中儲存的資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵(key)是不能重複的,它的值(value)是可以有重複的,存值採用 put(key,value)。Map中取值:value=m.get(key)(這個面試官常問,雖然不難,但也得注意)
HashMap和Hashtable的區別:
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現
二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value,即HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
PS:最後面試官有問到list初始化大小為多少,也就是說預設是多少,這個其實問的是 List list = new ArrayList() 這裡初始化 陣列的大小是多少,根據原始碼我們知道,預設大小為10.
4、多執行緒 wait()sleep()
答:聊到多執行緒,大致先問了多執行緒的實現方式,這個問題不用多說,很簡單,java提供了兩種方式,一個是繼承Thread類,另一個是實現Runnable介面,由於java不支援多繼承,所以在多繼承的時候,我們得優先選用 實現 Runnable介面,因為我們可以通過實現介面的辦法,間接的實現多繼承!【問了實現方式之後面試官又問了這兩種方法的使用】,其次問到了wait()和sleep()的區別,這兩個方法區別在於:sleep()是Thread類的,而wait()是Object類的,sleep是睡眠,指定時間後執行緒會繼續執行,不放棄對cpu資源的佔用(即不放棄物件鎖),相當於暫停指定t,wait()是等待,需要喚醒,它會釋放對cpu資源的佔用(即會放棄物件鎖),呼叫notify()和notifyAll()喚醒。
5、spring mvc框架結構 spring過濾器、登入過濾 spring mvc分層 spring註解
答:首先問到的是spring mvc框架,讓我講下其組成及功能,由於當時思路有點凌亂,我主動提出這個問題留到最後講!接下來面試官問了,spring過濾器,就簡單問了下我一般用過濾器做什麼,我回答一般處理字元以及編碼,顯然這不是面試官要的結果,於是面試官提示,加入你在做一個登陸註冊系統,怎麼用過濾器來驗證是否匹配,我直接脫口而出查資料庫啦,說完後自己都笑了,至於最後要問的是什麼這裡我好想也忘了,好想提到什麼controller 我說是的,然後應該沒答錯了,接下來就問到了spring的註解問題,說自己常用的註解有哪些,這裡我大致講了一些,總結摘錄如下:
Spring自帶依賴注入註解
1 @Required:依賴檢查;
2 @Autowired:自動裝配2 自動裝配,用於替代基於XML配置的自動裝配 基於@Autowired的自動裝配,預設是根據型別注入,可以用於構造器、欄位、方法注入
3 @Value:注入SpEL表示式 用於注入SpEL表示式,可以放置在欄位方法或引數上
@Value(value = “SpEL表示式”)
@Value(value = “#{message}”)
4 @Qualifier:限定描述符,用於細粒度選擇候選者
@Qualifier限定描述符除了能根據名字進行注入,但能進行更細粒度的控制如何選擇候選者
@Qualifier(value = “限定識別符號”)
JSR-250註解
1 @Resource:自動裝配,預設根據型別裝配,如果指定name屬性將根據名字裝配,可以使用如下方式來指定
@Resource(name = “識別符號”)
欄位或setter方法
2 @PostConstruct和PreDestroy:通過註解指定初始化和銷燬方法定義
JSR-330註解
1 @Inject:等價於預設的@Autowired,只是沒有required屬性
2 @Named:指定Bean名字,對應於Spring自帶@Qualifier中的預設的根據Bean名字注入情況
3 @Qualifier:只對應於Spring自帶@Qualifier中的擴充套件@Qualifier限定描述符註解,即只能擴充套件使用,沒有value屬性
JPA註解
@PersistenceContext
@PersistenceUnit用於注入EntityManagerFactory和EntityManager
具體這裡不詳細展開,大家可以參考一些專門針對註解的文章!
好了,接下來就提到spring mvc的分層了,總結如下:
使用Java spring進行MVC模式開發時,往往將資料模型分為兩部分,即DAO(Data Access Object,資料訪問物件)和Service(業務邏輯模型)。在第2步中,控制器向模型請求資料時,並不是直接向DAO請求資料,而是通過Service向DAO請求資料。這樣做的好處是,可以將業務邏輯與資料庫訪問獨立開,為將來系統更換資料儲存介質(如目前系統使用檔案系統儲存資料,將來可以更換為使用資料庫儲存,又或者是現在使用了MSSQL儲存資料,將來更換為MySQL等)提供了很大的靈活性。控制器只需要呼叫Service介面中的方法獲取或是處理資料,Service層對控制器傳入的資料進行業務邏輯處理封裝後,傳給DAO層,由DAO層負責將處理後的資料寫入資料庫中。在Service層使用了抽象工廠模式來實現Service層與DAO層的低耦合,Service層並不知道DAO層是如何實現的,實際上也不需要知道系統使用了哪種資料庫或是檔案系統。
action(控制器)、Dao(資料訪問層)、Service(業務邏輯)!view層(檢視 jsp之類的)!
最後就得言歸正傳了,回到spring mvc框架的結構上來,大概是照著下面總結的:
核心容器 核心容器提供 Spring 框架的基本功能。核心容器的主要元件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。
Spring 上下文 Spring 上下文是一個配置檔案,向 Spring 框架提供上下文資訊。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和排程功能。
Spring AOP 通過配置管理特性,Spring AOP 模組直接將面向方面的程式設計功能整合到了Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何物件支援 AOP。Spring AOP 模組為基於 Spring 的應用程式中的物件提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 元件,就可以將宣告性事務管理整合到應用程式中。
Spring DAO JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
Spring ORM Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的物件關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
Spring Web 模組 Web 上下文模組建立在應用程式上下文模組之上,為基於 Web 的應用程式提供了上下文。所以,Spring 框架支援與 Jakarta Struts 的整合。Web 模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。
Spring MVC 框架 MVC 框架是一個全功能的構建 Web 應用程式的 MVC 實現。通過策略介面,MVC 框架變成為高度可配置的,MVC 容納了大量檢視技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE 伺服器中,大多數功能也適用於不受管理的環境。Spring 的核心要點是:支援不繫結到特定 J2EE 服務的可重用業務和資料訪問物件。毫無疑問,這樣的物件可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程式、測試環境之間重用。
PS:題外要知道的:SpringMVC工作流程描述
1. 向伺服器傳送HTTP請求,請求被前端控制器 DispatcherServlet 捕獲。
2. DispatcherServlet 根據 -servlet.xml 中的配置對請求的URL進行解析,得到請求資源識別符號(URI)。 然後根據該URI,呼叫 HandlerMapping 獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以 HandlerExecutionChain 物件的形式返回。
3. DispatcherServlet 根據獲得的Handler,選擇一個合適的 HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(…)方法)。
4. 提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
5. HttpMessageConveter: 將請求訊息(如Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應資訊。
6. 資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等。
7. 資料根式化:對請求訊息進行資料格式化。 如將字串轉換成格式化數字或格式化日期等。
資料驗證: 驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中。
8. Handler(Controller)執行完成後,向 DispatcherServlet 返回一個 ModelAndView 物件;
9. 根據返回的ModelAndView,選擇一個適合的 ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet。
10. ViewResolver 結合Model和View,來渲染檢視。
11. 檢視負責將渲染結果返回給客戶端。
6、連表查詢方法、笛卡爾積通過什麼連線得到 sql對‘a’,‘b’,‘c’,‘d’排序,排成自己指定的順序
答:連表查詢方法,我大致說了三個,引入之前的答案:說句實在話,自從辭職讀研以來很久沒有用過sql語句了,關於這幾個連線光靠記憶的話,完全會是懵逼,幸虧自己還不算蠢,很自然的根據字面理解,我很好的回答了出來,left join就是返回包括左表中所有記錄和右表中聯結欄位相等的記錄,好了面試官會問你,那麼如果A表中,有甲丙丁3條記錄,B表中有甲乙丙丁4條記錄,那麼如果條件都滿足的情況,A left join B 丙記錄是否會被查出,答案是否定的!好了,right join就是和left join 相反的,inner join等值聯結 只返回2表中聯結欄位相等的行!講到這裡我就戛然而止,可能是面試官覺得我回答的還不夠全面,所以又提醒我那麼笛卡爾積怎麼實現的,我想了想,突然腦子中冒出了個Cross join,於是脫口而出,交叉連線,然後面試官嗯了下,於是接著往下走問我一般用什麼排序,我就回答,order by啦,然後就是提了下 desc 和ASC的含義,一個降序一個升序沒什麼好說的,最後話鋒一轉,問我,給我 a b c d 四個字元讓我按照自定義的方式排序怎麼實現,比如排序成 b a c d 我實話實說不知道。。。
7、分散式
最後一個問題是問我瞭解分散式不,我說稍微看了下,不怎麼了解,這段時間正打算看看。。。
PS:spring mvc模組及功能是最後回答的,所以回答完這些,面試官讓我自己提了些問題,隨便問了些,就是後悔沒用問我那幾個沒答出來的題目,本來是要問的,最後竟然忘了!。。。。