JAVA框架面試題整理之—第三篇

156、Spring MVC的工作原理是怎樣的巨柒?

答:SpringMVC的工作原理如下圖所示:

① 客戶端的所有請求都交給前端控制器DispatcherServlet來處理,它會負(fù)責(zé)調(diào)用系統(tǒng)的其他模塊來真正處理用戶的請求肥印。

② DispatcherServlet收到請求后孵班,將根據(jù)請求的信息(包括URL、HTTP協(xié)議方法奶甘、請求頭篷店、請求參數(shù)祭椰、Cookie等)以及HandlerMapping的配置找到處理該請求的Handler(任何一個對象都可以作為請求的Handler)臭家。

③在這個地方Spring會通過HandlerAdapter對該處理器進(jìn)行封裝。

④ HandlerAdapter是一個適配器方淤,它用統(tǒng)一的接口對各種Handler中的方法進(jìn)行調(diào)用钉赁。

⑤ Handler完成對用戶請求的處理后,會返回一個ModelAndView對象給DispatcherServlet携茂,ModelAndView顧名思義你踩,包含了數(shù)據(jù)模型以及相應(yīng)的視圖的信息。

⑥ ModelAndView的視圖是邏輯視圖讳苦,DispatcherServlet還要借助ViewResolver完成從邏輯視圖到真實(shí)視圖對象的解析工作带膜。

⑦ 當(dāng)?shù)玫秸嬲囊晥D對象后,DispatcherServlet會利用視圖對象對模型數(shù)據(jù)進(jìn)行渲染鸳谜。

⑧ 客戶端得到響應(yīng)膝藕,可能是一個普通的HTML頁面,也可以是XML或JSON字符串咐扭,還可以是一張圖片或者一個PDF文件芭挽。

157、如何在Spring IoC容器中配置數(shù)據(jù)源蝗肪?

答:

DBCP配置:

1

2

3

4

5

6

7

8

9

class="org.apache.commons.dbcp.BasicDataSource"??destroy-method="close">

C3P0配置:

1

2

3

4

5

6

7

8

9

class="com.mchange.v2.c3p0.ComboPooledDataSource"??destroy-method="close">

提示:DBCP的詳細(xì)配置在第153題中已經(jīng)完整的展示過了袜爪。

158、如何配置配置事務(wù)增強(qiáng)薛闪?







of an operation defined by the FooService interface -->

expression="execution(* x.y.service.FooService.*(..))"/>


destroy-method="close">



159辛馆、選擇使用Spring框架的原因(Spring框架為企業(yè)級開發(fā)帶來的好處有哪些)?

答:可以從以下幾個方面作答:

- 非侵入式:支持基于POJO的編程模式豁延,不強(qiáng)制性的要求實(shí)現(xiàn)Spring框架中的接口或繼承Spring框架中的類昙篙。

- IoC容器:IoC容器幫助應(yīng)用程序管理對象以及對象之間的依賴關(guān)系,對象之間的依賴關(guān)系如果發(fā)生了改變只需要修改配置文件而不是修改代碼术浪,因?yàn)榇a的修改可能意味著項(xiàng)目的重新構(gòu)建和完整的回歸測試瓢对。有了IoC容器,程序員再也不需要自己編寫工廠胰苏、單例硕蛹,這一點(diǎn)特別符合Spring的精神”不要重復(fù)的發(fā)明輪子”。

- AOP(面向切面編程):將所有的橫切關(guān)注功能封裝到切面(aspect)中,通過配置的方式將橫切關(guān)注功能動態(tài)添加到目標(biāo)代碼上法焰,進(jìn)一步實(shí)現(xiàn)了業(yè)務(wù)邏輯和系統(tǒng)服務(wù)之間的分離秧荆。另一方面,有了AOP程序員可以省去很多自己寫代理類的工作埃仪。

- MVC:Spring的MVC框架是非常優(yōu)秀的乙濒,從各個方面都可以甩Struts 2幾條街,為Web表示層提供了更好的解決方案卵蛉。

- 事務(wù)管理:Spring以寬廣的胸懷接納多種持久層技術(shù)颁股,并且為其提供了聲明式的事務(wù)管理,在不需要任何一行代碼的情況下就能夠完成事務(wù)管理傻丝。

- 其他:選擇Spring框架的原因還遠(yuǎn)不止于此甘有,Spring為Java企業(yè)級開發(fā)提供了一站式選擇,你可以在需要的時候使用它的部分和全部葡缰,更重要的是亏掀,你甚至可以在感覺不到Spring存在的情況下,在你的項(xiàng)目中使用Spring提供的各種優(yōu)秀的功能泛释。

160滤愕、Spring IoC容器配置Bean的方式?

答:

- 基于XML文件進(jìn)行配置怜校。

- 基于注解進(jìn)行配置间影。Autoward,Resource("beanid")

- 基于Java程序進(jìn)行配置(Spring 3+)

161、闡述Spring框架中Bean的生命周期韭畸?

答:

① Spring IoC容器找到關(guān)于Bean的定義并實(shí)例化該Bean宇智。

② Spring IoC容器對Bean進(jìn)行依賴注入。

③ 如果Bean實(shí)現(xiàn)了BeanNameAware接口胰丁,則將該Bean的id傳給setBeanName方法随橘。

④ 如果Bean實(shí)現(xiàn)了BeanFactoryAware接口,則將BeanFactory對象傳給setBeanFactory方法锦庸。

⑤ 如果Bean實(shí)現(xiàn)了BeanPostProcessor接口机蔗,則調(diào)用其postProcessBeforeInitialization方法。

⑥ 如果Bean實(shí)現(xiàn)了InitializingBean接口甘萧,則調(diào)用其afterPropertySet方法萝嘁。

⑦ 如果有和Bean關(guān)聯(lián)的BeanPostProcessors對象,則這些對象的postProcessAfterInitialization方法被調(diào)用扬卷。

⑧ 當(dāng)銷毀Bean實(shí)例時牙言,如果Bean實(shí)現(xiàn)了DisposableBean接口,則調(diào)用其destroy方法怪得。

162咱枉、依賴注入時如何注入集合屬性卑硫?

答:可以在定義Bean屬性時,通過 / / / 分別為其注入列表蚕断、集合欢伏、映射和鍵值都是字符串的映射屬性。

163亿乳、Spring中的自動裝配有哪些限制硝拧?

答:

- 如果使用了構(gòu)造器注入或者setter注入,那么將覆蓋自動裝配的依賴關(guān)系葛假。

- 基本數(shù)據(jù)類型的值障陶、字符串字面量、類字面量無法使用自動裝配來注入桐款。

- 優(yōu)先考慮使用顯式的裝配來進(jìn)行更精確的依賴注入而不是使用自動裝配咸这。

164夷恍、在Web項(xiàng)目中如何獲得Spring的IoC容器魔眨?

答:

1

2

WebApplicationContext ctx =

WebApplicationContextUtils.getWebApplicationContext(servletContext);

165.大型網(wǎng)站在架構(gòu)上應(yīng)當(dāng)考慮哪些問題?

答:

- 分層:分層是處理任何復(fù)雜系統(tǒng)最常見的手段之一酿雪,將系統(tǒng)橫向切分成若干個層面遏暴,每個層面只承擔(dān)單一的職責(zé),然后通過下層為上層提供的基礎(chǔ)設(shè)施和服務(wù)以及上層對下層的調(diào)用來形成一個完整的復(fù)雜的系統(tǒng)指黎。計(jì)算機(jī)網(wǎng)絡(luò)的開放系統(tǒng)互聯(lián)參考模型(OSI/RM)和Internet的TCP/IP模型都是分層結(jié)構(gòu)朋凉,大型網(wǎng)站的軟件系統(tǒng)也可以使用分層的理念將其分為持久層(提供數(shù)據(jù)存儲和訪問服務(wù))、業(yè)務(wù)層(處理業(yè)務(wù)邏輯醋安,系統(tǒng)中最核心的部分)和表示層(系統(tǒng)交互杂彭、視圖展示)。需要指出的是:(1)分層是邏輯上的劃分吓揪,在物理上可以位于同一設(shè)備上也可以在不同的設(shè)備上部署不同的功能模塊亲怠,這樣可以使用更多的計(jì)算資源來應(yīng)對用戶的并發(fā)訪問;(2)層與層之間應(yīng)當(dāng)有清晰的邊界柠辞,這樣分層才有意義团秽,才更利于軟件的開發(fā)和維護(hù)。

- 分割:分割是對軟件的縱向切分叭首。我們可以將大型網(wǎng)站的不同功能和服務(wù)分割開习勤,形成高內(nèi)聚低耦合的功能模塊(單元)。在設(shè)計(jì)初期可以做一個粗粒度的分割焙格,將網(wǎng)站分割為若干個功能模塊图毕,后期還可以進(jìn)一步對每個模塊進(jìn)行細(xì)粒度的分割,這樣一方面有助于軟件的開發(fā)和維護(hù)眷唉,另一方面有助于分布式的部署予颤,提供網(wǎng)站的并發(fā)處理能力和功能的擴(kuò)展损肛。

- 分布式:除了上面提到的內(nèi)容,網(wǎng)站的靜態(tài)資源(JavaScript荣瑟、CSS治拿、圖片等)也可以采用獨(dú)立分布式部署并采用獨(dú)立的域名,這樣可以減輕應(yīng)用服務(wù)器的負(fù)載壓力笆焰,也使得瀏覽器對資源的加載更快劫谅。數(shù)據(jù)的存取也應(yīng)該是分布式的,傳統(tǒng)的商業(yè)級關(guān)系型數(shù)據(jù)庫產(chǎn)品基本上都支持分布式部署嚷掠,而新生的NoSQL產(chǎn)品幾乎都是分布式的捏检。當(dāng)然,網(wǎng)站后臺的業(yè)務(wù)處理也要使用分布式技術(shù)不皆,例如查詢索引的構(gòu)建贯城、數(shù)據(jù)分析等,這些業(yè)務(wù)計(jì)算規(guī)模龐大霹娄,可以使用Hadoop以及MapReduce分布式計(jì)算框架來處理能犯。

- 集群:集群使得有更多的服務(wù)器提供相同的服務(wù),可以更好的提供對并發(fā)的支持犬耻。

- 緩存:所謂緩存就是用空間換取時間的技術(shù)踩晶,將數(shù)據(jù)盡可能放在距離計(jì)算最近的位置。使用緩存是網(wǎng)站優(yōu)化的第一定律枕磁。我們通常說的CDN渡蜻、反向代理、熱點(diǎn)數(shù)據(jù)都是對緩存技術(shù)的使用计济。

- 異步:異步是實(shí)現(xiàn)軟件實(shí)體之間解耦合的又一重要手段茸苇。異步架構(gòu)是典型的生產(chǎn)者消費(fèi)者模式,二者之間沒有直接的調(diào)用關(guān)系沦寂,只要保持?jǐn)?shù)據(jù)結(jié)構(gòu)不變学密,彼此功能實(shí)現(xiàn)可以隨意變化而不互相影響,這對網(wǎng)站的擴(kuò)展非常有利凑队。使用異步處理還可以提高系統(tǒng)可用性则果,加快網(wǎng)站的響應(yīng)速度(用Ajax加載數(shù)據(jù)就是一種異步技術(shù)),同時還可以起到削峰作用(應(yīng)對瞬時高并發(fā))漩氨。"西壮;能推遲處理的都要推遲處理”是網(wǎng)站優(yōu)化的第二定律,而異步是踐行網(wǎng)站優(yōu)化第二定律的重要手段叫惊。

- 冗余:各種服務(wù)器都要提供相應(yīng)的冗余服務(wù)器以便在某臺或某些服務(wù)器宕機(jī)時還能保證網(wǎng)站可以正常工作款青,同時也提供了災(zāi)難恢復(fù)的可能性。冗余是網(wǎng)站高可用性的重要保證霍狰。

166抡草、你用過的網(wǎng)站前端優(yōu)化的技術(shù)有哪些饰及?

答:

1 CDN加速:CDN(Content Distribute Network)的本質(zhì)仍然是緩存,將數(shù)據(jù)緩存在離用戶最近的地方康震,CDN通常部署在網(wǎng)絡(luò)運(yùn)營商的機(jī)房燎含,不僅可以提升響應(yīng)速度,還可以減少應(yīng)用服務(wù)器的壓力腿短。當(dāng)然屏箍,CDN緩存的通常都是靜態(tài)資源。

2 反向代理:反向代理相當(dāng)于應(yīng)用服務(wù)器的一個門面橘忱,可以保護(hù)網(wǎng)站的安全性赴魁,也可以實(shí)現(xiàn)負(fù)載均衡的功能,當(dāng)然最重要的是它緩存了用戶訪問的熱點(diǎn)資源钝诚,可以直接從反向代理將某些內(nèi)容返回給用戶瀏覽器颖御。

167、你使用過的應(yīng)用服務(wù)器優(yōu)化技術(shù)有哪些凝颇?

答:① 分布式緩存:緩存的本質(zhì)就是內(nèi)存中的哈希表潘拱,如果設(shè)計(jì)一個優(yōu)質(zhì)的哈希函數(shù),那么理論上哈希表讀寫的漸近時間復(fù)雜度為O(1)祈噪。緩存主要用來存放那些讀寫比很高泽铛、變化很少的數(shù)據(jù),這樣應(yīng)用程序讀取數(shù)據(jù)時先到緩存中讀取辑鲤,如果沒有或者數(shù)據(jù)已經(jīng)失效再去訪問數(shù)據(jù)庫或文件系統(tǒng),并根據(jù)擬定的規(guī)則將數(shù)據(jù)寫入緩存杠茬。對網(wǎng)站數(shù)據(jù)的訪問也符合二八定律(Pareto分布月褥,冪律分布),即80%的訪問都集中在20%的數(shù)據(jù)上瓢喉,如果能夠?qū)⑦@20%的數(shù)據(jù)緩存起來宁赤,那么系統(tǒng)的性能將得到顯著的改善。當(dāng)然栓票,使用緩存需要解決以下幾個問題:

- 頻繁修改的數(shù)據(jù)决左;

- 數(shù)據(jù)不一致與臟讀;

- 緩存雪崩(可以采用分布式緩存服務(wù)器集群加以解決走贪,memcached是廣泛采用的解決方案)佛猛;

- 緩存預(yù)熱;

- 緩存穿透(惡意持續(xù)請求不存在的數(shù)據(jù))坠狡。

② 異步操作:可以使用消息隊(duì)列將調(diào)用異步化继找,通過異步處理將短時間高并發(fā)產(chǎn)生的事件消息存儲在消息隊(duì)列中,從而起到削峰作用逃沿。電商網(wǎng)站在進(jìn)行促銷活動時婴渡,可以將用戶的訂單請求存入消息隊(duì)列幻锁,這樣可以抵御大量的并發(fā)訂單請求對系統(tǒng)和數(shù)據(jù)庫的沖擊。目前边臼,絕大多數(shù)的電商網(wǎng)站即便不進(jìn)行促銷活動哄尔,訂單系統(tǒng)都采用了消息隊(duì)列來處理。

③ 使用集群柠并。④ 代碼優(yōu)化:

- 多線程:基于Java的Web開發(fā)基本上都通過多線程的方式響應(yīng)用戶的并發(fā)請求究飞,使用多線程技術(shù)在編程上要解決線程安全問題,主要可以考慮以下幾個方面:A. 將對象設(shè)計(jì)為無狀態(tài)對象(這和面向?qū)ο蟮木幊逃^點(diǎn)是矛盾的堂鲤,在面向?qū)ο蟮氖澜缰斜灰暈椴涣荚O(shè)計(jì))亿傅,這樣就不會存在并發(fā)訪問時對象狀態(tài)不一致的問題。B. 在方法內(nèi)部創(chuàng)建對象瘟栖,這樣對象由進(jìn)入方法的線程創(chuàng)建葵擎,不會出現(xiàn)多個線程訪問同一對象的問題。使用ThreadLocal將對象與線程綁定也是很好的做法半哟,這一點(diǎn)在前面已經(jīng)探討過了酬滤。C. 對資源進(jìn)行并發(fā)訪問時應(yīng)當(dāng)使用合理的鎖機(jī)制。

- 非阻塞I/O: 使用單線程和非阻塞I/O是目前公認(rèn)的比多線程的方式更能充分發(fā)揮服務(wù)器性能的應(yīng)用模式寓涨,基于Node.js構(gòu)建的服務(wù)器就采用了這樣的方式盯串。Java在JDK 1.4中就引入了NIO(Non-blockingI/O),在Servlet 3規(guī)范中又引入了異步Servlet的概念,這些都為在服務(wù)器端采用非阻塞I/O提供了必要的基礎(chǔ)戒良。

- 資源復(fù)用:資源復(fù)用主要有兩種方式体捏,一是單例,二是對象池糯崎,我們使用的數(shù)據(jù)庫連接池几缭、線程池都是對象池化技術(shù),這是典型的用空間換取時間的策略沃呢,另一方面也實(shí)現(xiàn)對資源的復(fù)用年栓,從而避免了不必要的創(chuàng)建和釋放資源所帶來的開銷。

http://bbs.itheima.com/forum.php?mod=viewthread&tid=380333

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薄霜,一起剝皮案震驚了整個濱河市某抓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惰瓜,老刑警劉巖否副,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸵熟,居然都是意外死亡副编,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痹届,“玉大人呻待,你說我怎么就攤上這事《痈” “怎么了蚕捉?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柴淘。 經(jīng)常有香客問我迫淹,道長,這世上最難降的妖魔是什么为严? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任敛熬,我火速辦了婚禮,結(jié)果婚禮上第股,老公的妹妹穿的比我還像新娘应民。我一直安慰自己,他們只是感情好夕吻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布诲锹。 她就那樣靜靜地躺著,像睡著了一般涉馅。 火紅的嫁衣襯著肌膚如雪归园。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天稚矿,我揣著相機(jī)與錄音庸诱,去河邊找鬼。 笑死盐捷,一個胖子當(dāng)著我的面吹牛偶翅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碉渡,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼母剥!你這毒婦竟也來了滞诺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤环疼,失蹤者是張志新(化名)和其女友劉穎习霹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炫隶,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淋叶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伪阶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞檩。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡处嫌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斟湃,到底是詐尸還是另有隱情熏迹,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布凝赛,位于F島的核電站注暗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏墓猎。R本人自食惡果不足惜捆昏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毙沾。 院中可真熱鬧骗卜,春花似錦、人聲如沸搀军。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩句。三九已至焚刺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間门烂,已是汗流浹背乳愉。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屯远,地道東北人蔓姚。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像慨丐,于是被迫代替她去往敵國和親坡脐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理房揭,服務(wù)發(fā)現(xiàn)备闲,斷路器,智...
    卡卡羅2017閱讀 134,708評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法捅暴,類相關(guān)的語法恬砂,內(nèi)部類的語法,繼承相關(guān)的語法蓬痒,異常的語法泻骤,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4493116...
    王帥199207閱讀 2,404評論 0 19
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評論 6 342
  • 這部分主要是開源Java EE框架方面的內(nèi)容,包括Hibernate、MyBatis狱掂、Spring演痒、Spring ...
    雜貨鋪老板閱讀 1,392評論 0 2