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