1.Spring 框架的概念?
Spring框架是一個(gè)開放源代碼的J2EE應(yīng)用程序框架,由Rod Johnson發(fā)起,是針對(duì)bean的生命周期進(jìn)行管理的輕量級(jí)容器(lightweight container)。 Spring解決了開發(fā)者在J2EE開發(fā)中遇到的許多常見的問題,提供了功能強(qiáng)大IOC、AOP及Web MVC等功能。Spring可以單獨(dú)應(yīng)用于構(gòu)筑應(yīng)用程序,也可以和Struts、Webwork、Tapestry等眾多Web框架組合使用,并且可以與 Swing等桌面應(yīng)用程序AP組合。因此, Spring不僅僅能應(yīng)用于JEE應(yīng)用程序之中,也可以應(yīng)用于桌面應(yīng)用程序以及小應(yīng)用程序之中。Spring框架主要由七部分組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
2.Spring框架 組成?
Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
組成Spring框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:
1、核心容器 (Spring Core):核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要組件是 BeanFactory,它是
工廠模式的實(shí)現(xiàn)。BeanFactory 使用
控制反轉(zhuǎn)(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開
[3] 。
2、Spring 上下文(Spring Context):Spring 上下文是一個(gè)
配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如
JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。
3、Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持
AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
4、Spring DAO:JDBC
DAO抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理
異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。
5、Spring ORM:負(fù)責(zé)框架中對(duì)象關(guān)系映射,提供相關(guān)ORM 接入框架的關(guān)系對(duì)象管理工具
[2] 。Spring 框架插入了若干個(gè)ORM框架,從而提供了 ORM 的對(duì)象關(guān)系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。
6、Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文。所以,Spring框架支持與 Jakarta Struts 的集成。Web 模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到
域?qū)ο?/a>的工作。
7、Spring MVC 框架:
MVC框架是一個(gè)全功能的構(gòu)建 Web應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過策略接口,MVC框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、
Velocity、
Tiles、iText 和 POI。模型由javabean構(gòu)成,存放于Map;視圖是一個(gè)接口,負(fù)責(zé)顯示模型;控制器表示邏輯代碼,是Controller的實(shí)現(xiàn)。Spring框架的功能可以用在任何
J2EE服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring 的核心要點(diǎn)是:支持不綁定到特定 J2EE服務(wù)的可重用業(yè)務(wù)和
數(shù)據(jù)訪問對(duì)象。毫無疑問,這樣的對(duì)象可以在不同J2EE 環(huán)境(Web 或EJB)、獨(dú)立應(yīng)用程序、
測(cè)試環(huán)境之間重用。
3.Spring框架 特征?
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對(duì)象不依賴于Spring的特定類。
控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(
IoC)的技術(shù)促進(jìn)了低耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過被動(dòng)的方式傳遞進(jìn)來,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。它的底層設(shè)計(jì)模式采用了工廠模式,所有的 Bean 都需要注冊(cè)到Bean工廠中,將其初始化和生命周期的監(jiān)控交由工廠實(shí)現(xiàn)管理。程序員只需要按照規(guī)定的格式進(jìn)行Bean開發(fā),然后利用XML文件進(jìn)行bean 的定義和參數(shù)配置,其他的動(dòng)態(tài)生成和監(jiān)控就不需要調(diào)用者完成,而是統(tǒng)一交給了平臺(tái)進(jìn)行管理。
[4] 控制反轉(zhuǎn)是軟件設(shè)計(jì)大師 Martin Fowler在 2004 年發(fā)表的”Inversion of Control Containers and the Dependency Injection pattern”提出的。這篇文章系統(tǒng)闡述了控制反轉(zhuǎn)的思想,提出了控制反轉(zhuǎn)有依賴查找和依賴注入實(shí)現(xiàn)方式??刂品崔D(zhuǎn)意味著在系統(tǒng)開發(fā)過程中,設(shè)計(jì)的類將交由容器去控制,而不是在類的內(nèi)部去控制,類與類之間的關(guān)系將交由容器處理,一個(gè)類在需要調(diào)用另一個(gè)類時(shí),只要調(diào)用另一個(gè)類在容器中注冊(cè)的名字就可以得到這個(gè)類的實(shí)例,與傳統(tǒng)的編程方式有了很大的不同,“不用你找,我來提供給你”,這就是控制反轉(zhuǎn)的含義 [5] 。
面向切面——Spring提供了
面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和
事務(wù)(
transaction)管理)進(jìn)行
內(nèi)聚性的開發(fā)。
應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。
容器——Spring包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(
prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
框架——Spring可以將簡(jiǎn)單的
組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,
應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(
事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。
MVC——Spring的作用是整合,但不僅僅限于整合,Spring 框架可以被看做是一個(gè)企業(yè)解決方案級(jí)別的框架??蛻舳税l(fā)送請(qǐng)求,服務(wù)器控制器(由DispatcherServlet實(shí)現(xiàn)的)完成請(qǐng)求的轉(zhuǎn)發(fā),控制器調(diào)用一個(gè)用于映射的類HandlerMapping,該類用于將請(qǐng)求映射到對(duì)應(yīng)的處理器來處理請(qǐng)求。HandlerMapping 將請(qǐng)求映射到對(duì)應(yīng)的處理器Controller(相當(dāng)于Action)在Spring 當(dāng)中如果寫一些處理器組件,一般實(shí)現(xiàn)Controller 接口,在Controller 中就可以調(diào)用一些Service 或DAO 來進(jìn)行數(shù)據(jù)操作 ModelAndView 用于存放從DAO 中取出的數(shù)據(jù),還可以存放響應(yīng)視圖的一些數(shù)據(jù)。 如果想將處理結(jié)果返回給用戶,那么在Spring 框架中還提供一個(gè)視圖組件ViewResolver,該組件根據(jù)Controller 返回的標(biāo)示,找到對(duì)應(yīng)的視圖,將響應(yīng)response 返回給用戶。
所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測(cè)試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。
4.Spring框架 特點(diǎn)?
1.方便解耦,簡(jiǎn)化開發(fā)
通過Spring提供的IoC容器,我們可以將對(duì)象之間的依賴關(guān)系交由Spring進(jìn)行控制,避免硬編碼所造成的過度程序耦合。有了Spring,用戶不必再為單實(shí)例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應(yīng)用。
通過Spring提供的
AOP功能,方便進(jìn)行面向切面的編程,許多不容易用傳統(tǒng)OOP實(shí)現(xiàn)的功能可以通過AOP輕松應(yīng)付。
在Spring中,我們可以從單調(diào)煩悶的事務(wù)管理代碼中解脫出來,通過聲明式方式靈活地進(jìn)行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。
4.方便程序的測(cè)試
可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作,在Spring里,測(cè)試不再是昂貴的操作,而是隨手可做的事情。例如:Spring對(duì)Junit4支持,可以通過注解方便的測(cè)試Spring程序。
5.方便集成各種優(yōu)秀框架
Spring不排斥各種優(yōu)秀的開源框架,相反,Spring可以降低各種框架的使用難度,Spring提供了對(duì)各種優(yōu)秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用難度
Spring對(duì)很多難用的Java EE API(如JDBC,JavaMail,遠(yuǎn)程調(diào)用等)提供了一個(gè)薄薄的封裝層,通過Spring的簡(jiǎn)易封裝,這些Java EE API的使用難度大為降低。
7.Java 源碼是經(jīng)典學(xué)習(xí)范例
Spring的源碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)運(yùn),處處體現(xiàn)著大師對(duì)
Java設(shè)計(jì)模式靈活運(yùn)用以及對(duì)Java技術(shù)的高深造詣。Spring框架源碼無疑是Java技術(shù)的最佳實(shí)踐范例。如果想在短時(shí)間內(nèi)迅速提高自己的Java技術(shù)水平和應(yīng)用開發(fā)水平,學(xué)習(xí)和研究Spring源碼將會(huì)使你收到意想不到的效果。
5.Spring框架好處?
Spring能有效地組織你的中間層對(duì)象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有API的framework,你會(huì)發(fā)現(xiàn)Spring關(guān)注了遺留下的問題。Spring能消除在許多工程上對(duì)Singleton的過多使用。根據(jù)我的經(jīng)驗(yàn),這是一個(gè)主要的問題,它減少了系統(tǒng)的
可測(cè)試性和
面向?qū)ο?/a>特性。
Spring能消除使用各種各樣格式的屬性定制文件的需要,在整個(gè)應(yīng)用和工程中,可通過一種一致的方法來進(jìn)行配置。曾經(jīng)我們可能對(duì)類是否有某個(gè)屬性會(huì)感到迷惑,因此我們不得不去看它的javadoc或源碼。自從有了Spring,你可很簡(jiǎn)單地看到類的JavaBean屬性。反轉(zhuǎn)控制的使用(在下面討論)幫助完成這種簡(jiǎn)化。
Spring能通過接口而不是類促進(jìn)好的編程習(xí)慣,減少編程代價(jià)到幾乎為零。
Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的APIs。在Spring應(yīng)用中的大多數(shù)
業(yè)務(wù)對(duì)象沒有依賴于Spring。
Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local EJBs來實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼。
Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應(yīng)用。例如,Spring能使用AOP提供聲明性
事務(wù)而不通過使用EJB容器,如果你僅僅需要與單個(gè)的數(shù)據(jù)庫(kù)打交道,甚至不需要JTA實(shí)現(xiàn)。
Spring為數(shù)據(jù)存取提供了一致的框架,不論是使用JDBC或O/R mapping產(chǎn)品(如Hibernate)。
Spring確實(shí)使你能通過最簡(jiǎn)單可行的解決辦法解決你的問題。這些特性是有很大價(jià)值的。
總結(jié)起來,Spring有如下優(yōu)點(diǎn):
1.低侵入式設(shè)計(jì),代碼污染極低
2.獨(dú)立于各種
應(yīng)用服務(wù)器,基于Spring框架的應(yīng)用,可以真正實(shí)現(xiàn)Write Once,Run Anywhere的承諾
4.Spring的AOP支持允許將一些通用任務(wù)如安全、事務(wù)、日志等進(jìn)行集中式管理,從而提供了更好的復(fù)用
5.Spring的ORM和DAO提供了與第三方持久層框架的良好整合,并簡(jiǎn)化了底層的數(shù)據(jù)庫(kù)訪問
6.Spring并不強(qiáng)制應(yīng)用完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部