网易面试汇总
項目經歷
第一步:先介紹為什么做這個項目,目的是什么?給誰用?解決了用戶什么問題?行業背景是什么? 
 第二步:有哪些模塊?主要的業務流程? 
 第三步:用到哪些技術? 
 第四步:你負責的那一部分的流程、技術?
注意:最多詳細的介紹3個項目,每介紹一個涉及的技術點有哪幾點心里亮敞敞的,說出個一二三,最好說的他燒腦。
spring的AOP原理和底層實現(框架技術:扯了一下概念和反射機制)
Spring的注解講一下;(框架技術)
靜態代理和動態代理區別講一下;
tcp和udp的區別;(計算機網絡知識:就從可靠性,通訊方式,數據大小,應用方面說了說)
cglib底層實現;(框架技術:懵逼)
數據庫的樂觀鎖原理和實現;
數據庫索引的設計原理以及意義
接著上面的問題,問了給定一個數據庫,如何設計索引,有什么要注意的?
給定淘寶秒殺場景,請設計系統實現秒殺(思維能力:又是淘寶,我就說了一下多線程,生產者消費者也扯上去了,他說是多節點實現,其實我沒聽明白他想讓我說啥。。。)
微博粉絲和關注者,以及用戶信息,請實現數據庫表,來關聯起這些表(數據庫:我畫圖,然后講了一下,問我有沒有優化,我說想不出來)
針對我設計的表,進行查詢操作,問我所有的表查詢完后,多少次操作。(數據庫)
之前實習的做了什么項目?講解一下。
就著項目,提出海量數據的時候,集合存不下怎么辦(Java核心技術:我實在想不到方法,就說了一下把文件進行分割然后再存集合里。)
數據庫里的事務原理講一下;(數據庫:我就扯了一下隔離級別以及臟讀,不可重復讀以及幻讀中事務的問題
手寫jdbc連接數據庫的代碼(Java核心技術:真心記不得了,只記得流程和類,直接寫了一堆注釋上去)
數據庫的事務特性有哪些?
課題講一下做的什么;
通信是偏軟件還是硬件?為什么學Java(聽到這個我就有點崩潰了,依據我的直覺,gg了)(職業發展規劃) 最后問我有什么要問的?(提問環節:我真想問問他是不是搞數據庫的,大部分都是數據庫,虐死。。最后就問了兩個小問題,讓我回到前臺那邊等通知
準備 9大排序,3大查找
實現序列化接口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模塊及功能是最后回答的,所以回答完這些,面試官讓我自己提了些問題,隨便問了些,就是后悔沒用問我那幾個沒答出來的題目,本來是要問的,最后竟然忘了!。。。。
總結
 
                            
                        - 上一篇: 论述我的工作经历
- 下一篇: git remote add origi
