筆者最近比較忙,一邊在實(shí)習(xí)一邊在尋找明年畢業(yè)更好的工作,不過(guò)論壇里的朋友非常支持小弟繼續(xù)寫(xiě),今天是周末,泡上一杯咖啡,繼續(xù)與大家分享J2ee部分的學(xué)習(xí)經(jīng)驗(yàn)。今天的主題是目前很流行也很好的一個(gè)開(kāi)源框架-Spring。
引用《Spring2.0技術(shù)手冊(cè)》上的一段話:
Spring的核心是個(gè)輕量級(jí)容器,它是實(shí)現(xiàn)IoC容器和非侵入性的框架,并提供AOP概念的實(shí)現(xiàn)方式;提供對(duì)持久層、事務(wù)的支持;提供MVC Web框架的實(shí)現(xiàn),并對(duì)于一些常用的企業(yè)服務(wù)API提供一致的模型封裝,是一個(gè)全方位的應(yīng)用程序框架,除此之外,對(duì)于現(xiàn)存的各種框架,Spring也提供了與它們相整合的方案。
接下來(lái)筆者先談?wù)勛约旱囊恍├斫獍桑琒pring框架的發(fā)起者之前一本很著名的書(shū)名字大概是《J2ee Development without EJB》,他提倡用輕量級(jí)的組件代替重量級(jí)的EJB。筆者還沒(méi)有看完那本著作,只閱讀了部分章節(jié)。其中有一點(diǎn)分析覺(jué)得是很有道理的:
EJB里在服務(wù)器端有Web Container和EJB Container,從前的觀點(diǎn)是各層之間應(yīng)該在物理上隔離,Web Container處理視圖功能、在EJB Container中處理業(yè)務(wù)邏輯功能、然后也是EBJ Container控制數(shù)據(jù)庫(kù)持久化。這樣的層次是很清晰,但是一個(gè)很嚴(yán)重的問(wèn)題是Web Container和EJB Container畢竟是兩個(gè)不同的容器,它們之間要通信就得用的是RMI機(jī)制和JNDI服務(wù),同樣都在服務(wù)端,卻物理上隔離,而且每次業(yè)務(wù)請(qǐng)求都要遠(yuǎn)程調(diào)用,有沒(méi)有必要呢?看來(lái)并非隔離都是好的。
再看看輕量級(jí)和重量級(jí)的區(qū)別,筆者看過(guò)很多種說(shuō)法,覺(jué)得最有道理的是輕量級(jí)代表是POJO + IoC,重量級(jí)的代表是Container + Factory。(EJB2.0是典型的重量級(jí)組件的技術(shù))我們盡量使用輕量級(jí)的Pojo很好理解,意義就在于兼容性和可適應(yīng)性,移植不需要改變?cè)瓉?lái)的代碼。而Ioc與Factory比起來(lái),Ioc的優(yōu)點(diǎn)是更大的靈活性,通過(guò)配置可以控制很多注入的細(xì)節(jié),而Factory模式,行為是相對(duì)比較封閉固定的,生產(chǎn)一個(gè)對(duì)象就必須接受它全部的特點(diǎn),不管是否需要。其實(shí)輕量級(jí)和重量級(jí)都是相對(duì)的概念,使用資源更少、運(yùn)行負(fù)載更小的自然就算輕量。
話題扯遠(yuǎn)了,因?yàn)镾pring框架帶來(lái)了太多可以探討的地方。比如它的非侵入性:指的是它提供的框架實(shí)現(xiàn)可以讓程序員編程卻感覺(jué)不到框架的存在,這樣所寫(xiě)的代碼并沒(méi)有和框架綁定在一起,可以隨時(shí)抽離出來(lái),這也是Spring設(shè)計(jì)的目標(biāo)。Spring是唯一可以做到真正的針對(duì)接口編程,處處都是接口,不依賴綁定任何實(shí)現(xiàn)類。同時(shí),Spring還設(shè)計(jì)了自己的事務(wù)管理、對(duì)象管理和Model2 的MVC框架,還封裝了其他J2ee的服務(wù)在里面,在實(shí)現(xiàn)上基本都在使用依賴注入和AOP的思想。由此我們大概可以看到Spring是一個(gè)什么概念上的框架,代表了很多優(yōu)秀思想,值得深入學(xué)習(xí)。筆者強(qiáng)調(diào),學(xué)習(xí)并不是框架,而是框架代表的思想,就像我們當(dāng)初學(xué)Struts一樣……
1.Spring MVC
關(guān)于IoC和AOP筆者在上篇已經(jīng)稍微解釋過(guò)了,這里先通過(guò)Spring的MVC框架來(lái)給大家探討一下Spring的特點(diǎn)吧。(畢竟大部分人已經(jīng)很熟悉Struts了,對(duì)比一下吧)
眾所周知MVC的核心是控制器。類似Struts中的ActionServlet,Spring里面前端控制器叫做DispatcherServlet。里面充當(dāng)Action的組件叫做Controller,返回的視圖層對(duì)象叫做ModelAndView,提交和返回都可能要經(jīng)過(guò)過(guò)濾的組件叫做 Interceptor。
讓我們看看一個(gè)從請(qǐng)求到返回的流程吧:
(1) 前臺(tái)Jsp或Html通過(guò)點(diǎn)擊submit,將數(shù)據(jù)裝入了request域
(2) 請(qǐng)求被Interceptor攔截下來(lái),執(zhí)行preHandler()方法出前置判斷
(3) 請(qǐng)求到達(dá)DispathcerServlet
(4) DispathcerServlet通過(guò)Handler Mapping來(lái)決定每個(gè)reuqest應(yīng)該轉(zhuǎn)發(fā)給哪個(gè)后端控制器Controlle
引用《Spring2.0技術(shù)手冊(cè)》上的一段話:
Spring的核心是個(gè)輕量級(jí)容器,它是實(shí)現(xiàn)IoC容器和非侵入性的框架,并提供AOP概念的實(shí)現(xiàn)方式;提供對(duì)持久層、事務(wù)的支持;提供MVC Web框架的實(shí)現(xiàn),并對(duì)于一些常用的企業(yè)服務(wù)API提供一致的模型封裝,是一個(gè)全方位的應(yīng)用程序框架,除此之外,對(duì)于現(xiàn)存的各種框架,Spring也提供了與它們相整合的方案。
接下來(lái)筆者先談?wù)勛约旱囊恍├斫獍桑琒pring框架的發(fā)起者之前一本很著名的書(shū)名字大概是《J2ee Development without EJB》,他提倡用輕量級(jí)的組件代替重量級(jí)的EJB。筆者還沒(méi)有看完那本著作,只閱讀了部分章節(jié)。其中有一點(diǎn)分析覺(jué)得是很有道理的:
EJB里在服務(wù)器端有Web Container和EJB Container,從前的觀點(diǎn)是各層之間應(yīng)該在物理上隔離,Web Container處理視圖功能、在EJB Container中處理業(yè)務(wù)邏輯功能、然后也是EBJ Container控制數(shù)據(jù)庫(kù)持久化。這樣的層次是很清晰,但是一個(gè)很嚴(yán)重的問(wèn)題是Web Container和EJB Container畢竟是兩個(gè)不同的容器,它們之間要通信就得用的是RMI機(jī)制和JNDI服務(wù),同樣都在服務(wù)端,卻物理上隔離,而且每次業(yè)務(wù)請(qǐng)求都要遠(yuǎn)程調(diào)用,有沒(méi)有必要呢?看來(lái)并非隔離都是好的。
再看看輕量級(jí)和重量級(jí)的區(qū)別,筆者看過(guò)很多種說(shuō)法,覺(jué)得最有道理的是輕量級(jí)代表是POJO + IoC,重量級(jí)的代表是Container + Factory。(EJB2.0是典型的重量級(jí)組件的技術(shù))我們盡量使用輕量級(jí)的Pojo很好理解,意義就在于兼容性和可適應(yīng)性,移植不需要改變?cè)瓉?lái)的代碼。而Ioc與Factory比起來(lái),Ioc的優(yōu)點(diǎn)是更大的靈活性,通過(guò)配置可以控制很多注入的細(xì)節(jié),而Factory模式,行為是相對(duì)比較封閉固定的,生產(chǎn)一個(gè)對(duì)象就必須接受它全部的特點(diǎn),不管是否需要。其實(shí)輕量級(jí)和重量級(jí)都是相對(duì)的概念,使用資源更少、運(yùn)行負(fù)載更小的自然就算輕量。
話題扯遠(yuǎn)了,因?yàn)镾pring框架帶來(lái)了太多可以探討的地方。比如它的非侵入性:指的是它提供的框架實(shí)現(xiàn)可以讓程序員編程卻感覺(jué)不到框架的存在,這樣所寫(xiě)的代碼并沒(méi)有和框架綁定在一起,可以隨時(shí)抽離出來(lái),這也是Spring設(shè)計(jì)的目標(biāo)。Spring是唯一可以做到真正的針對(duì)接口編程,處處都是接口,不依賴綁定任何實(shí)現(xiàn)類。同時(shí),Spring還設(shè)計(jì)了自己的事務(wù)管理、對(duì)象管理和Model2 的MVC框架,還封裝了其他J2ee的服務(wù)在里面,在實(shí)現(xiàn)上基本都在使用依賴注入和AOP的思想。由此我們大概可以看到Spring是一個(gè)什么概念上的框架,代表了很多優(yōu)秀思想,值得深入學(xué)習(xí)。筆者強(qiáng)調(diào),學(xué)習(xí)并不是框架,而是框架代表的思想,就像我們當(dāng)初學(xué)Struts一樣……
1.Spring MVC
關(guān)于IoC和AOP筆者在上篇已經(jīng)稍微解釋過(guò)了,這里先通過(guò)Spring的MVC框架來(lái)給大家探討一下Spring的特點(diǎn)吧。(畢竟大部分人已經(jīng)很熟悉Struts了,對(duì)比一下吧)
眾所周知MVC的核心是控制器。類似Struts中的ActionServlet,Spring里面前端控制器叫做DispatcherServlet。里面充當(dāng)Action的組件叫做Controller,返回的視圖層對(duì)象叫做ModelAndView,提交和返回都可能要經(jīng)過(guò)過(guò)濾的組件叫做 Interceptor。
讓我們看看一個(gè)從請(qǐng)求到返回的流程吧:
(1) 前臺(tái)Jsp或Html通過(guò)點(diǎn)擊submit,將數(shù)據(jù)裝入了request域
(2) 請(qǐng)求被Interceptor攔截下來(lái),執(zhí)行preHandler()方法出前置判斷
(3) 請(qǐng)求到達(dá)DispathcerServlet
(4) DispathcerServlet通過(guò)Handler Mapping來(lái)決定每個(gè)reuqest應(yīng)該轉(zhuǎn)發(fā)給哪個(gè)后端控制器Controlle