微服務(wù)架構(gòu)之深入淺出SpringMVC

為開發(fā)團(tuán)隊(duì)選擇一款優(yōu)秀的MVC框架是件難事兒孵户,在眾多可行的方案中決擇需要很高的經(jīng)驗(yàn)和水平萧朝。你的一個(gè)決定會影響團(tuán)隊(duì)未來的幾年。要考慮方面太多:

1夏哭、簡單易用检柬,以提高開發(fā)效率。使小部分的精力在框架上竖配,大部分的精力放在業(yè)務(wù)上何址。

2、性能優(yōu)秀械念,這是一個(gè)最能吸引眼球的話題头朱。

3、盡量使用大眾的框架(避免使用小眾的龄减、私有的框架)项钮,新招聘來的開發(fā)人員有一些這方面技術(shù)積累,減低人員流動再適應(yīng)的影響希停。

?如果你還在為這件事件發(fā)愁烁巫,本文最適合你了。選擇Spring MVC吧宠能。

Spring MVC是當(dāng)前最優(yōu)秀的MVC框架亚隙,自從Spring 2.5版本發(fā)布后,由于支持注解配置违崇,易用性有了大幅度的提高阿弃。Spring 3.0更加完善,實(shí)現(xiàn)了對Struts 2的超越⌒哐樱現(xiàn)在越來越多的開發(fā)團(tuán)隊(duì)選擇了Spring MVC渣淳。

Struts2也是非常優(yōu)秀的MVC構(gòu)架,優(yōu)點(diǎn)非常多比如良好的結(jié)構(gòu)伴箩,攔截器的思想入愧,豐富的功能。但這里想說的是缺點(diǎn),Struts2由于采用了值棧棺蛛、OGNL表達(dá)式怔蚌、struts2標(biāo)簽庫等,會導(dǎo)致應(yīng)用的性能下降旁赊,應(yīng)避免使用這些功能桦踊。而Struts2的多層攔截器、多實(shí)例action性能都很好终畅。


首先钞钙,看一下Spring的最基本使用方式,直接看代碼

概括的描述一下Spring背后的操作声离,解析applicationgContext.xml,將xml中定義的bean(如loginService和loginResource)解析成Spring內(nèi)部的BeanDefinition瘫怜,并以beanName(如loginService)為key术徊,BeanDefinition(如loginService相應(yīng)的BeanDefinition)為value存儲到DefaultListableBeanFactory中的beanDefinitionMap(其實(shí)就是一個(gè)ConcurrentHashMap)中,同時(shí)將beanName存入beanDefinitionNames(List類型)中鲸湃,然后遍歷beanDefinitionNames中的beanName赠涮,進(jìn)行bean的實(shí)例化并填充屬性,在實(shí)例化的過程中暗挑,如果有依賴沒有被實(shí)例化將先實(shí)例化其依賴笋除,然后實(shí)例化本身,實(shí)例化完成后將實(shí)例存入單例bean的緩存中炸裆,當(dāng)調(diào)用getBean方法時(shí)垃它,到單例bean的緩存中查找,如果找到并經(jīng)過轉(zhuǎn)換后返回這個(gè)實(shí)例(如LoginResource的實(shí)例)烹看,之后就可以直接使用了国拇。


使用Spring MVC

配置DispatcherServlet是第一步。 DispatcherServlet是一個(gè)Servlet,所以可以配置多個(gè)DispatcherServlet惯殊。

DispatcherServlet是前置控制器酱吝,配置在web.xml文件中的。攔截匹配的請求土思,Servlet攔截匹配規(guī)則要自已定義务热,把攔截下來的請求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller(我們寫的Action)來處理己儒。有問題想問我的可以加我的交流群:582100479

?“某某規(guī)則”:是根據(jù)你使用了哪個(gè)HandlerMapping接口的實(shí)現(xiàn)類的不同而不同崎岂。 先來看第一個(gè)例子:

1是啟動順序,讓這個(gè)Servlet隨Servletp容器一起啟動址愿。

*.form會攔截*.form結(jié)尾的請求该镣。

example這個(gè)Servlet的名字是example,可以有多個(gè)DispatcherServlet,是通過名字來區(qū)分的损合。每一個(gè)DispatcherServlet有自己的WebApplicationContext上下文對象省艳。同時(shí)保存的ServletContext中和Request對象中,關(guān)于key嫁审,以后說明跋炕。

在DispatcherServlet的初始化過程中,框架會在web應(yīng)用的 WEB-INF文件夾下尋找名為[servlet-name]-servlet.xml 的配置文件律适,生成文件中定義的bean辐烂。

第二個(gè)例子:

指明了配置文件的文件名,不使用默認(rèn)配置文件名捂贿,而使用springMVC.xml配置文件纠修。

其中**.xml這里可以使用多種寫法

1、不寫,使用默認(rèn)值:/WEB-INF/-servlet.xml

2厂僧、/WEB-INF/classes/springMVC.xml

3扣草、classpath*:springMVC-mvc.xml

4、多個(gè)值用逗號分隔

Spring會創(chuàng)建一個(gè)WebApplicationContext上下文颜屠,稱為父上下文(父容器) 辰妙,保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值甫窟。

可以使用Spring提供的工具類取出上下文對象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);

DispatcherServlet是一個(gè)Servlet,可以同時(shí)配置多個(gè)密浑,每個(gè) DispatcherServlet有一個(gè)自己的上下文對象(WebApplicationContext),稱為子上下文(子容器)粗井,子上下文可以訪問父上下文中的內(nèi)容尔破,但父上下文不能訪問子上下文中的內(nèi)容。 它也保存在 ServletContext中浇衬,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名稱呆瞻。當(dāng)一個(gè)Request對象產(chǎn)生時(shí),會把這個(gè)子上下文對象(WebApplicationContext)保存在Request對象中径玖,key是DispatcherServlet.class.getName() + ".CONTEXT"痴脾。

可以使用工具類取出上下文對象:RequestContextUtils.getWebApplicationContext(request);

說明 :Spring 并沒有限制我們,必須使用父子上下文梳星。我們可以自己決定如何使用赞赖。

Java--大項(xiàng)目能做好--按傳統(tǒng)方式做,規(guī)規(guī)矩矩的做冤灾,好擴(kuò)展前域,好維護(hù)。

Java--小項(xiàng)目能做快--按激進(jìn)方式做韵吨,一周時(shí)間就可以出一個(gè)版本匿垄,先上線接受市場(用戶)的反饋,再改進(jìn),再反饋椿疗,時(shí)間就是生命(成本)漏峰。

針對上面的問題我特意整理了一下,有很多技術(shù)不是靠幾句話能講清楚届榄,所以干脆找朋友錄制了一些視頻浅乔,很多問題其實(shí)答案很簡單,但是背后的思考和邏輯不簡單铝条,要做到知其然還要知其所以然靖苇。如果想學(xué)習(xí)Java工程化、高性能及分布式班缰、深入淺出贤壁。微服務(wù)、Spring埠忘,MyBatis芯砸,Netty源碼分析的朋友可以加我的Java交流群:582100479,群里有阿里大牛直播講解技術(shù)给梅,以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双揪,一起剝皮案震驚了整個(gè)濱河市动羽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渔期,老刑警劉巖运吓,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疯趟,居然都是意外死亡拘哨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門信峻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倦青,“玉大人,你說我怎么就攤上這事盹舞〔洌” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵踢步,是天一觀的道長癣亚。 經(jīng)常有香客問我,道長获印,這世上最難降的妖魔是什么述雾? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上玻孟,老公的妹妹穿的比我還像新娘唆缴。我一直安慰自己,他們只是感情好取募,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布琐谤。 她就那樣靜靜地躺著,像睡著了一般玩敏。 火紅的嫁衣襯著肌膚如雪斗忌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天旺聚,我揣著相機(jī)與錄音织阳,去河邊找鬼。 笑死砰粹,一個(gè)胖子當(dāng)著我的面吹牛唧躲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碱璃,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弄痹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嵌器?” 一聲冷哼從身側(cè)響起肛真,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爽航,沒想到半個(gè)月后蚓让,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讥珍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年历极,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衷佃。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趟卸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氏义,到底是詐尸還是另有隱情衰腌,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布觅赊,位于F島的核電站右蕊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吮螺。R本人自食惡果不足惜饶囚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一帕翻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萝风,春花似錦嘀掸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歇万,卻和暖如春揩晴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪磺。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工硫兰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寒锚。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓劫映,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刹前。 傳聞我的和親對象是個(gè)殘疾皇子泳赋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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