在講源碼之前铆帽,先讓我們回顧一下一下Spring的基本概念,當(dāng)然德谅,在看源碼之前你需要使用過spring或者spirngmvc爹橱。
Spring是什么
Spring是一個開源的輕量級Java SE(Java 標(biāo)準(zhǔn)版本)/Java EE(Java 企業(yè)版本)開發(fā)應(yīng)用框架,其目的是用于簡化企業(yè)級應(yīng)用程序開發(fā)。應(yīng)用程序是由一組相互協(xié)作的對象組成愧驱。而在傳統(tǒng)應(yīng)用程序開發(fā)中慰技,一個完整的應(yīng)用是由一組相互協(xié)作的對象組成。所以開發(fā)一個應(yīng)用除了要開發(fā)業(yè)務(wù)邏輯之外组砚,最多的是關(guān)注如何使這些對象協(xié)作來完成所需功能吻商,而且要低耦合、高內(nèi)聚糟红。業(yè)務(wù)邏輯開發(fā)是不可避免的艾帐,那如果有個框架出來幫我們來創(chuàng)建對象及管理這些對象之間的依賴關(guān)系∨璩ィ可能有人說了柒爸,比如“抽象工廠、工廠方法設(shè)計模式”不也可以幫我們創(chuàng)建對象事扭,“生成器模式”幫我們處理對象間的依賴關(guān)系捎稚,不也能完成這些功能嗎?可是這些又需要我們創(chuàng)建另一些工廠類求橄、生成器類今野,我們又要而外管理這些類,增加了我們的負擔(dān)罐农,如果能有種通過配置方式來創(chuàng)建對象条霜,管理對象之間依賴關(guān)系,我們不需要通過工廠和生成器來創(chuàng)建及管理對象之間的依賴關(guān)系涵亏,這樣我們是不是減少了許多工作蛔外,加速了開發(fā),能節(jié)省出很多時間來干其他事溯乒。Spring框架剛出來時主要就是來完成這個功能。
Spring框架除了幫我們管理對象及其依賴關(guān)系豹爹,還提供像通用日志記錄裆悄、性能統(tǒng)計、安全控制臂聋、異常處理等面向切面的能力光稼,還能幫我管理最頭疼的數(shù)據(jù)庫事務(wù),本身提供了一套簡單的JDBC訪問實現(xiàn)孩等,提供與第三方數(shù)據(jù)訪問框架集成(如Hibernate艾君、JPA),與各種Java EE技術(shù)整合(如Java Mail肄方、任務(wù)調(diào)度等等)冰垄,提供一套自己的web層框架Spring MVC、而且還能非常簡單的與第三方web框架集成权她。從這里我們可以認為Spring是一個超級粘合平臺虹茶,除了自己提供功能外逝薪,還提供粘合其他技術(shù)和框架的能力,從而使我們可以更自由的選擇到底使用什么技術(shù)進行開發(fā)蝴罪。而且不管是JAVA SE(C/S架構(gòu))應(yīng)用程序還是JAVA EE(B/S架構(gòu))應(yīng)用程序都可以使用這個平臺進行開發(fā)董济。讓我們來深入看一下Spring到底能幫我們做些什么?
Spring能幫我們做什么
Spring除了不能幫我們寫業(yè)務(wù)邏輯要门,其余的幾乎什么都能幫助我們簡化開發(fā):
一虏肾、傳統(tǒng)程序開發(fā),創(chuàng)建對象及組裝對象間依賴關(guān)系由我們在程序內(nèi)部進行控制欢搜,這樣會加大各個對象間的耦合封豪,如果我們要修改對象間的依賴關(guān)系就必須修改源代碼,重新編譯狂巢、部署撑毛;而如果采用Spring,則由Spring根據(jù)配置文件來進行創(chuàng)建及組裝對象間依賴關(guān)系唧领,只需要改配置文件即可藻雌,無需重新編譯。所以斩个,Spring能幫我們根據(jù)配置文件創(chuàng)建及組裝對象之間的依賴關(guān)系胯杭。
二、當(dāng)我們要進行一些日志記錄受啥、權(quán)限控制做个、性能統(tǒng)計等時,在傳統(tǒng)應(yīng)用程序當(dāng)中我們可能在需要的對象或方法中進行滚局,而且比如權(quán)限控制居暖、性能統(tǒng)計大部分是重復(fù)的,這樣代碼中就存在大量重復(fù)代碼藤肢,即使有人說我把通用部分提取出來太闺,那必然存在調(diào)用還是存在重復(fù),像性能統(tǒng)計我們可能只是在必要時才進行嘁圈,在診斷完畢后要刪除這些代碼省骂;還有日志記錄,比如記錄一些方法訪問日志最住、數(shù)據(jù)訪問日志等等钞澳,這些都會滲透到各個要訪問方法中;還有權(quán)限控制涨缚,必須在方法執(zhí)行開始進行審核轧粟,想想這些是多么可怕而且是多么無聊的工作。如果采用Spring,這些日志記錄逃延、權(quán)限控制览妖、性能統(tǒng)計從業(yè)務(wù)邏輯中分離出來,通過Spring支持的面向切面編程揽祥,在需要這些功能的地方動態(tài)添加這些功能讽膏,無需滲透到各個需要的方法或?qū)ο笾校挥腥丝赡苷f了拄丰,我們可以使用“代理設(shè)計模式”或“包裝器設(shè)計模式”府树,你可以使用這些,但還是需要通過編程方式來創(chuàng)建代理對象料按,還是要耦合這些代理對象奄侠,而采用Spring 面向切面編程能提供一種更好的方式來完成上述功能,一般通過配置方式载矿,而且不需要在現(xiàn)有代碼中添加任何額外代碼垄潮,現(xiàn)有代碼專注業(yè)務(wù)邏輯。所以闷盔,Spring 面向切面編程能幫助我們無耦合的實現(xiàn)日志記錄弯洗,性能統(tǒng)計,安全控制逢勾。
三牡整、在傳統(tǒng)應(yīng)用程序當(dāng)中,我們?nèi)绾蝸硗瓿蓴?shù)據(jù)庫事務(wù)管理溺拱?需要一系列“獲取連接逃贝,執(zhí)行SQL,提交或回滾事務(wù)迫摔,關(guān)閉連接”沐扳,而且還要保證在最后一定要關(guān)閉連接,多么可怕的事情句占,而且也很無聊迫皱;如果采用Spring,我們只需獲取連接辖众,執(zhí)行SQL,其他的都交給Spring來管理了和敬,簡單吧凹炸。所以,Spring能非常簡單的幫我們管理數(shù)據(jù)庫事務(wù)昼弟。
四啤它、Spring還提供了與第三方數(shù)據(jù)訪問框架(如Hibernate、JPA)無縫集成,而且自己也提供了一套JDBC訪問模板变骡,來方便數(shù)據(jù)庫訪問离赫。
五、Spring還提供與第三方Web(如Struts塌碌、JSF)框架無縫集成渊胸,而且自己也提供了一套Spring MVC框架,來方便web層搭建台妆。
六翎猛、Spring能方便的與Java EE(如Java Mail、任務(wù)調(diào)度)整合接剩,與更多技術(shù)整合(比如緩存框架)切厘。
Spring能幫我們做這么多事情,提供這么多功能和與那么多主流技術(shù)整合懊缺,而且是幫我們做了開發(fā)中比較頭疼和困難的事情疫稿,那可能有人會問,難道只有Spring這一個框架鹃两,沒有其他選擇遗座?當(dāng)然有,比如EJB需要依賴應(yīng)用服務(wù)器怔毛、開發(fā)效率低员萍、在開發(fā)中小型項目是宰雞拿牛刀,雖然發(fā)展到現(xiàn)在EJB比較好用了拣度,但還是比較笨重還需要依賴應(yīng)用服務(wù)器等碎绎。那為何需要使用Spring,而不是其他框架呢抗果?讓我們接著往下看筋帖。
為何需要Spring
一 首先闡述幾個概念
1、應(yīng)用程序:是能完成我們所需要功能的成品冤馏,比如購物網(wǎng)站日麸、OA系統(tǒng)。
2逮光、框架:是能完成一定功能的半成品代箭,比如我們可以使用框架進行購物網(wǎng)站開發(fā);框架做一部分功能涕刚,我們自己做一部分功能嗡综,這樣應(yīng)用程序就創(chuàng)建出來了。而且框架規(guī)定了你在開發(fā)應(yīng)用程序時的整體架構(gòu)杜漠,提供了一些基礎(chǔ)功能极景,還規(guī)定了類和對象的如何創(chuàng)建察净、如何協(xié)作等,從而簡化我們開發(fā)盼樟,讓我們專注于業(yè)務(wù)邏輯開發(fā)氢卡。
3、非侵入式設(shè)計:從框架角度可以這樣理解晨缴,無需繼承框架提供的類译秦,這種設(shè)計就可以看作是非侵入式設(shè)計,如果繼承了這些框架類喜庞,就是侵入設(shè)計诀浪,如果以后想更換框架之前寫過的代碼幾乎無法重用,如果非侵入式設(shè)計則之前寫過的代碼仍然可以繼續(xù)使用延都。
4雷猪、輕量級及重量級:輕量級是相對于重量級而言的,輕量級一般就是非入侵性的晰房、所依賴的東西非常少求摇、資源占用非常少、部署簡單等等殊者,其實就是比較容易使用与境,而重量級正好相反。
5猖吴、POJO:POJO(Plain Old Java Objects)簡單的Java對象摔刁,它可以包含業(yè)務(wù)邏輯或持久化邏輯,但不擔(dān)當(dāng)任何特殊角色且不繼承或不實現(xiàn)任何其它Java框架的類或接口海蔽。
6共屈、容器:在日常生活中容器就是一種盛放東西的器具,從程序設(shè)計角度看就是裝對象的的對象党窜,因為存在放入拗引、拿出等操作,所以容器還要管理對象的生命周期幌衣。
7矾削、控制反轉(zhuǎn):即Inversion of Control,縮寫為IoC豁护,控制反轉(zhuǎn)還有一個名字叫做依賴注入(Dependency Injection)哼凯,就是由容器控制程序之間的關(guān)系,而非傳統(tǒng)實現(xiàn)中楚里,由程序代碼直接操控挡逼。
8、Bean:一般指容器管理對象腻豌,在Spring中指Spring IoC容器管理對象家坎。
二 為什么需要Spring及Spring的優(yōu)點
●非常輕量級的容器:以集中的、自動化的方式進行應(yīng)用程序?qū)ο髣?chuàng)建和裝配吝梅,負責(zé)對象創(chuàng)建和裝配虱疏,管理對象生命周期,能組合成復(fù)雜的應(yīng)用程序苏携。Spring容器是非侵入式的(不需要依賴任何Spring特定類)做瞪,而且完全采用POJOs進行開發(fā),使應(yīng)用程序更容易測試右冻、更容易管理装蓬。而且核心JAR包非常小,Spring3.0.5不到1M纱扭,而且不需要依賴任何應(yīng)用服務(wù)器牍帚,可以部署在任何環(huán)境(Java SE或Java EE)。
●AOP:AOP是Aspect Oriented Programming的縮寫乳蛾,意思是面向切面編程暗赶,提供從另一個角度來考慮程序結(jié)構(gòu)以完善面向?qū)ο缶幊蹋ㄏ鄬τ贠OP),即可以通過在編譯期間肃叶、裝載期間或運行期間實現(xiàn)在不修改源代碼的情況下給程序動態(tài)添加功能的一種技術(shù)蹂随。通俗點說就是把可重用的功能提取出來,然后將這些通用功能在合適的時候織入到應(yīng)用程序中因惭;比如安全岳锁,日記記錄,這些都是通用的功能蹦魔,我們可以把它們提取出來激率,然后在程序執(zhí)行的合適地方織入這些代碼并執(zhí)行它們,從而完成需要的功能并復(fù)用了這些功能版姑。
● 簡單的數(shù)據(jù)庫事務(wù)管理:在使用數(shù)據(jù)庫的應(yīng)用程序當(dāng)中柱搜,自己管理數(shù)據(jù)庫事務(wù)是一項很讓人頭疼的事,而且很容易出現(xiàn)錯誤剥险,Spring支持可插入的事務(wù)管理支持聪蘸,而且無需JEE環(huán)境支持,通過Spring管理事務(wù)可以把我們從事務(wù)管理中解放出來來專注業(yè)務(wù)邏輯表制。
●JDBC抽象及ORM框架支持:Spring使JDBC更加容易使用健爬;提供DAO(數(shù)據(jù)訪問對象)支持,非常方便集成第三方ORM框架么介,比如Hibernate等娜遵;并且完全支持Spring事務(wù)和使用Spring提供的一致的異常體系。
●靈活的Web層支持:Spring本身提供一套非常強大的MVC框架壤短,而且可以非常容易的與第三方MVC框架集成设拟,比如Struts等慨仿。
●簡化各種技術(shù)集成:提供對Java Mail、任務(wù)調(diào)度纳胧、JMX镰吆、JMS、JNDI跑慕、EJB万皿、動態(tài)語言、遠程訪問核行、Web Service等的集成牢硅。
Spring能幫助我們簡化應(yīng)用程序開發(fā),幫助我們創(chuàng)建和組裝對象芝雪,為我們管理事務(wù)减余,簡單的MVC框架,可以把Spring看作是一個超級粘合平臺绵脯,能把很多技術(shù)整合在一起佳励,形成一個整體,使系統(tǒng)結(jié)構(gòu)更優(yōu)良蛆挫、性能更出眾赃承,從而加速我們程序開發(fā),有如上優(yōu)點悴侵,我們沒有理由不考慮使用它瞧剖。
如何學(xué)好Spring
要學(xué)好Spring,首先要明確Spring是個什么東西可免,能幫我們做些什么事情抓于,知道了這些然后做個簡單的例子,這樣就基本知道怎么使用Spring了浇借。Spring核心是IoC容器捉撮,所以一定要透徹理解什么是IoC容器,以及如何配置及使用容器妇垢,其他所有技術(shù)都是基于容器實現(xiàn)的巾遭;理解好IoC后,接下來是面向切面編程闯估,首先還是明確概念灼舍,基本配置,最后是實現(xiàn)原理涨薪,接下來就是數(shù)據(jù)庫事務(wù)管理骑素,其實Spring管理事務(wù)是通過面向切面編程實現(xiàn)的,所以基礎(chǔ)很重要刚夺,IoC容器和面向切面編程搞定后献丑,其余都是基于這倆東西的實現(xiàn)末捣,學(xué)起來就更加輕松了。要學(xué)好Spring不能急创橄,一定要把基礎(chǔ)打牢塔粒,基礎(chǔ)牢固了,這就是磨刀不誤砍柴工筐摘。
Spring基礎(chǔ)
Spring架構(gòu)圖
圖 1-1 Spring架構(gòu)圖
核心容器:包括Core、Beans船老、Context咖熟、EL模塊。
●Core模塊:封裝了框架依賴的最底層部分柳畔,包括資源訪問馍管、類型轉(zhuǎn)換及一些常用工具類。
●Beans模塊:提供了框架的基礎(chǔ)部分薪韩,包括反轉(zhuǎn)控制和依賴注入确沸。其中Bean Factory是容器核心,本質(zhì)是“工廠設(shè)計模式”的實現(xiàn)俘陷,而且無需編程實現(xiàn)“單例設(shè)計模式”罗捎,單例完全由容器控制,而且提倡面向接口編程拉盾,而非面向?qū)崿F(xiàn)編程桨菜;所有應(yīng)用程序?qū)ο蠹皩ο箝g關(guān)系由框架管理,從而真正把你從程序邏輯中把維護對象之間的依賴關(guān)系提取出來捉偏,所有這些依賴關(guān)系都由BeanFactory來維護倒得。
●Context模塊:以Core和Beans為基礎(chǔ),集成Beans模塊功能并添加資源綁定夭禽、數(shù)據(jù)驗證霞掺、國際化、Java EE支持讹躯、容器生命周期菩彬、事件傳播等;核心接口是ApplicationContext蜀撑。
●EL模塊:提供強大的表達式語言支持挤巡,支持訪問和修改屬性值,方法調(diào)用酷麦,支持訪問及修改數(shù)組矿卑、容器和索引器,命名變量沃饶,支持算數(shù)和邏輯運算母廷,支持從Spring 容器獲取Bean轻黑,它也支持列表投影、選擇和一般的列表聚合等琴昆。
AOP氓鄙、Aspects模塊:
●AOP模塊:Spring AOP模塊提供了符合 AOP Alliance規(guī)范的面向方面的編程(aspect-oriented programming)實現(xiàn),提供比如日志記錄业舍、權(quán)限控制抖拦、性能統(tǒng)計等通用功能和業(yè)務(wù)邏輯分離的技術(shù),并且能動態(tài)的把這些功能添加到需要的代碼中舷暮;這樣各專其職态罪,降低業(yè)務(wù)邏輯和通用功能的耦合。
●Aspects模塊:提供了對AspectJ的集成下面,AspectJ提供了比Spring ASP更強大的功能复颈。
數(shù)據(jù)訪問/集成模塊:該模塊包括了JDBC、ORM沥割、OXM耗啦、JMS和事務(wù)管理。
●事務(wù)模塊:該模塊用于Spring管理事務(wù)机杜,只要是Spring管理對象都能得到Spring管理事務(wù)的好處帜讲,無需在代碼中進行事務(wù)控制了,而且支持編程和聲明性的事物管理叉庐。
●JDBC模塊:提供了一個JBDC的樣例模板舒帮,使用這些模板能消除傳統(tǒng)冗長的JDBC編碼還有必須的事務(wù)控制,而且能享受到Spring管理事務(wù)的好處陡叠。
●ORM模塊:提供與流行的“對象-關(guān)系”映射框架的無縫集成玩郊,包括Hibernate、JPA枉阵、Ibatiss等译红。而且可以使用Spring事務(wù)管理,無需額外控制事務(wù)兴溜。
●OXM模塊:提供了一個對Object/XML映射實現(xiàn)侦厚,將java對象映射成XML數(shù)據(jù),或者將XML數(shù)據(jù)映射成java對象拙徽,Object/XML映射實現(xiàn)包括JAXB刨沦、Castor、XMLBeans和XStream膘怕。
●JMS模塊:用于JMS(Java Messaging Service)想诅,提供一套 “消息生產(chǎn)者、消息消費者”模板用于更加簡單的使用JMS,JMS用于用于在兩個應(yīng)用程序之間来破,或分布式系統(tǒng)中發(fā)送消息篮灼,進行異步通信。
●Web/Remoting模塊:Web/Remoting模塊包含了Web徘禁、Web-Servlet诅诱、Web-Struts、Web-Porlet模塊送朱。
●Web模塊:提供了基礎(chǔ)的web功能娘荡。例如多文件上傳、集成IoC容器驶沼、遠程過程訪問(RMI它改、Hessian、Burlap)以及Web Service支持商乎,并提供一個RestTemplate類來提供方便的Restful services訪問。
●Web-Servlet模塊:提供了一個Spring MVC Web框架實現(xiàn)祭阀。Spring MVC框架提供了基于注解的請求資源注入鹉戚、更簡單的數(shù)據(jù)綁定、數(shù)據(jù)驗證等及一套非常易用的JSP標(biāo)簽专控,完全無縫與Spring其他技術(shù)協(xié)作抹凳。
●Web-Struts模塊:提供了與Struts無縫集成,Struts1.x 和Struts2.x都支持
Test模塊: Spring支持Junit和TestNG測試框架伦腐,而且還額外提供了一些基于Spring的測試功能赢底,比如在測試Web框架時,模擬Http請求的功能柏蘑。
典型應(yīng)用場景
Spring可以應(yīng)用到許多場景幸冻,從最簡單的標(biāo)準(zhǔn)Java SE程序到企業(yè)級應(yīng)用程序都能使用Spring來構(gòu)建。以下介紹幾個比較流行的應(yīng)用場景:
●典型Web應(yīng)用程序應(yīng)用場景:
圖1-2 web應(yīng)用程序應(yīng)用場景
在Web應(yīng)用程序應(yīng)用場景中咳焚,典型的三層架構(gòu):數(shù)據(jù)模型層實現(xiàn)域?qū)ο笄⑺穑粩?shù)據(jù)訪問層實現(xiàn)數(shù)據(jù)訪問;邏輯層實現(xiàn)業(yè)務(wù)邏輯革半;web層提供頁面展示碑定;所有這些層組件都由Spring進行管理,享受到Spring事務(wù)管理又官、AOP等好處延刘,而且請求唯一入口就是DispachterServlet,它通過把請求映射為相應(yīng)web層組件來實現(xiàn)相應(yīng)請求功能六敬。
●遠程訪問應(yīng)用場景:
Spring能非常方便的提供暴露RMI服務(wù)碘赖,遠程訪問服務(wù)如Hessian、Burlap等,實現(xiàn)非常簡單只需通過在Spring中配置相應(yīng)的地址及需要暴露的服務(wù)即可輕松實現(xiàn)崖疤,后邊會有介紹秘车;
●EJB應(yīng)用場景:
Spring也可以與EJB輕松集成,后邊會詳細介紹劫哼。
注:如果想要更加深入的了解IoC和DI叮趴,請參考大師級人物Martin Fowler的一篇經(jīng)典文章《Inversion of Control Containers and the Dependency Injection pattern》,原文地址:http://www.martinfowler.com/articles/injection.html权烧。