一、什么是Spring
Spring是一個(gè)開源框架,Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開發(fā)框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來(lái)。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring使用基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從? 簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)。
二、Spring起源
要談Spring的歷史,就要先談J2EE。J2EE應(yīng)用程序的廣泛實(shí)現(xiàn)是在1999年和2000年開始的,它的出現(xiàn)帶來(lái)了諸如事務(wù)管理之類的核心中間層概念的標(biāo)準(zhǔn)化,但是在實(shí)踐中并沒(méi)有獲得絕對(duì)的成功,因?yàn)殚_發(fā)效率,開發(fā)難度和實(shí)際的性能都令人失望。
曾經(jīng)使用過(guò)EJB開發(fā)JAVA EE應(yīng)用的人,一定知道,在EJB開始的學(xué)習(xí)和應(yīng)用非常的艱苦,很多東西都不能一下子就很容易的理解。EJB要嚴(yán)格地實(shí)現(xiàn)各種不同類型的接口,類似的或者重復(fù)的代碼大量存在。而配置也是復(fù)雜和單調(diào),同樣使用JNDI進(jìn)行對(duì)象查找的代碼也是單調(diào)而枯燥。雖然有一些開發(fā)工作隨著xdoclet的出現(xiàn),而有所緩解,但是學(xué)習(xí)EJB的高昂代價(jià),和極低的開發(fā)效率,極高的資源消耗,都造成了EJB的使用困難。而Spring出現(xiàn)的初衷就是為了解決類似的這些問(wèn)題。
Spring的一個(gè)最大的目的就是使JAVA EE開發(fā)更加容易。同時(shí),Spring之所以與Struts、Hibernate等單層框架不同,是因?yàn)镾pring致力于提供一個(gè)以統(tǒng)一的、高效的方式構(gòu)造整個(gè)應(yīng)用,并且可以將單層框架以最佳的組合揉和在一起建立一個(gè)連貫的體系??梢哉f(shuō)Spring是一個(gè)提供了更完善開發(fā)環(huán)境的一個(gè)框架,可以為POJO(Plain Ordinary Java Object)對(duì)象提供企業(yè)級(jí)的服務(wù)。
Spring的形成,最初來(lái)自Rod Jahnson所著的一本很有影響力的書籍《Expert One-on-One J2EE Design and Development》,就是在這本書中第一次出現(xiàn)了Spring的一些核心思想,該書出版于2002年。另外一本書《Expert One-on-One J2EE Development without EJB》,更進(jìn)一步闡述了在不使用EJB開發(fā)JAVA EE企業(yè)級(jí)應(yīng)用的一些設(shè)計(jì)思想和具體的做法。有時(shí)間了可以詳細(xì)的研讀一下。
三、Spring框架特征
Spring是一個(gè)開源框架,它由Rod Johnson創(chuàng)建。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對(duì)象不依賴于Spring的特定類。
控制反轉(zhuǎn)——Spring通過(guò)一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái),而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。
面向切面——Spring提供了面向切面編程的豐富支持,允許通過(guò)分離應(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ā)留給了你。
所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測(cè)試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。
四、Spring框架結(jié)構(gòu)
1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要組件是 BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn)(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
2、Spring 上下文:Spring 上下文是一個(gè)配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。
3、Spring AOP:通過(guò)配置管理特性,Spring AOP 模塊直接將面向切面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
4、Spring DAO:JDBCDAO抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處理和不同數(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: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ū)ο蟮墓ぷ鳌?/p>
7、Spring MVC 框架:MVC框架是一個(gè)全功能的構(gòu)建 Web應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過(guò)策略接口,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ù)訪問(wèn)對(duì)象。毫無(wú)疑問(wèn),這樣的對(duì)象可以在不同J2EE 環(huán)境(Web 或EJB)、獨(dú)立應(yīng)用程序、測(cè)試環(huán)境之間重用。
五、總結(jié)
Spring給復(fù)雜的J2EE開發(fā)帶來(lái)了春天。它的核心是輕量級(jí)的IoC容器,它的目標(biāo)是為J2EE應(yīng)用提供了全方位的整合框架,在Spring框架下實(shí)現(xiàn)多個(gè)子框架的組合,這些子框架之間可以彼此獨(dú)立,也可以使用其它的框架方案加以代替,Spring希望為企業(yè)應(yīng)用提供一站式(one-stopshop)的解決方案。