1.Spring框架簡介
Spring為JavaEE開發(fā)提供了一個輕量級的解決方案恕出,主要表現(xiàn)為:
? ? ?(1)IOC(DI)又稱控制翻轉(zhuǎn)或依賴注入的核心機制,提供你了bean工廠(Spring容器),降低了對業(yè)務(wù)對象替 ????????換的復(fù)雜性唆姐,提高了組件之間的解耦。
? ? ?(2)AOP的將一些通用任務(wù),如安全彪薛、事務(wù)、日志等集中進行管理怠蹂,提高復(fù)用性和管理的便捷性善延。
? ? ?(3)ORM和DAO提供了與第三方持久層框架的良好整合,簡化了底層數(shù)據(jù)訪問城侧。
? ? ?(4)提供了優(yōu)秀的Web MVC框架易遣。
可以說Spring是貫穿表現(xiàn)層、業(yè)務(wù)層嫌佑、持久層豆茫,為JavaEE提供了一站式解決方案的框架。此外屋摇,Spring還有以下好處:
? ? (1)低侵入設(shè)計揩魂,代碼污染極低。
? ? (2)基于Spring框架的應(yīng)用炮温,可以獨立于各種應(yīng)用服務(wù)器火脉,實現(xiàn) write once, run anywhere,
? ? (3)Spring可以與第三方框架良好整合(如ORM,DAO等模塊與其他框架整合),但同時Spring提供了高度開放性柒啤,應(yīng)用不會被強制依賴Spring忘分,開發(fā)者可以自由選擇Spring的部分或者全部。
Spring并不局限于中間層白修,而是為系統(tǒng)各層都提供了企業(yè)級解決方案(例如IOC可以使用Spring框架可以帶來諸多好處妒峦,例如進行數(shù)據(jù)庫事務(wù)處理,遠程調(diào)用兵睛,JMS消息處理肯骇,JMX操作處理,而這些處理都不需要開發(fā)人員直接使用相關(guān)API(JDBC祖很, JMX, JMS 等)
2.Sping架構(gòu)
Spring框架是分模塊存在笛丙,除了最核心的Spring Core Container(即Spring容器)是必要模塊之外,其他模塊都是可選假颇,視需要而定胚鸯。
官方文檔Spring4.0的架構(gòu)圖中,包含了20多個子模塊笨鸡,大致可以分為四類?
1)核心容器(Core Container)?
2)數(shù)據(jù)訪問和集成(Data Access/Integration)?
3)Web?
4)AOP姜钳。
本質(zhì)上Spring可以總結(jié)為以下七個模塊坦冠。
其中常用模塊的大致功能如下。
核心容器:核心容器提供 Spring 框架的基本功能哥桥。核心容器的主要組件是?BeanFactory辙浑,它是工廠模式的實現(xiàn)。BeanFactory?使用控制反轉(zhuǎn)?(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼分開拟糕。
Spring 上下文:Spring 上下文是一個配置文件判呕,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù)送滞,例如 JNDI侠草、EJB、電子郵件犁嗅、國際化边涕、校驗和調(diào)度功能。
Spring AOP:通過配置管理特性愧哟,Spring AOP 模塊直接將面向切面的編程功能集成到了 Spring 框架中奥吩『咔可以將一些通用任務(wù)蕊梧,如安全、事務(wù)腮介、日志等集中進行管理肥矢,提高了復(fù)用性和管理的便捷性。
Spring DAO:為JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu)叠洗,可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯誤消息甘改。異常層次結(jié)構(gòu)簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)灭抑。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)十艾。
Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關(guān)系工具腾节,其中包括 JDO忘嫉、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)案腺。
Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上庆冕,為基于 Web 的應(yīng)用程序提供了上下文。所以劈榨,Spring 框架支持與 Jakarta Struts 的集成访递。Web 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>
Spring MVC 框架:MVC 框架是一個全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實現(xiàn)。通過策略接口同辣,MVC 框架變成為高度可配置的拷姿,MVC 容納了大量視圖技術(shù)惭载,其中包括 JSP、Velocity跌前、Tiles棕兼、iText 和 POI。
?3.環(huán)境搭建(Spring的版本要和eclipse版本對應(yīng))
首先需要下載Spring框架?spring-framework-4.0.4.RELEASE-dist抵乓,4.0.4版官方地址為?http://repo.springsource.org/libs-release-local/org/springframework/spring/4.0.4.RELEASE/ (如果覺得太慢也可以去國內(nèi)網(wǎng)站下載)
此外伴挚,還需要下載一個必要組件commons-logging-1.1.3-bin?,可以在http://commons.apache.org/官網(wǎng)下載也可以在國內(nèi)網(wǎng)站下載灾炭。
其他諸如log4j之類的并不是必須下載的茎芋。
下載好以上兩個壓縮包。在workspace下新建一個lib目錄作為user library蜈出。將Spring壓縮包解壓之后田弥,將libs目錄下的 *RELEASE.jar(共21個)都拷貝到你的workspace下的lib目錄;將commons包也解壓铡原,將根目錄的*.1.3.jar(共3個)都拷貝到lib目錄下偷厦。
4.簡單demo及控制反轉(zhuǎn)(IOC)和依賴注入(DI)簡介
J2EE提倡面向接口編程,Spring也是針對的接口編程燕刻,即在代碼中只使用規(guī)范(即接口)只泼,而將真正的實現(xiàn)類配置在文件中,由Spring的配置文件來決定將會使用哪一個實現(xiàn)類,這也叫做控制反轉(zhuǎn)(IOC)或者依賴注入(DI)。
現(xiàn)在我們假設(shè)有這么一個場景炮叶, 我們指定一類人去使用一類斧頭乡括,不同的人可以使用不同的斧頭,當(dāng)然其效果不一樣。
按照J2EE的建議,首先我們需要定義“人”和“斧頭”兩個規(guī)范,即創(chuàng)建兩個接口
斧頭接口:
斧頭接口的一個實現(xiàn):
人接口:
人接口的一個實現(xiàn):
下面要寫一個測試類本橙,使用Person接口的一個實現(xiàn)類的對象,去調(diào)用Axe的一個實現(xiàn)類的對象脆诉,
按照傳統(tǒng)編程方式甚亭,我們一般會寫成下面這樣,
重點是第10行和11行库说,即PerssonImpl類和AxeImpl類耦合在了java代碼中狂鞋,如果現(xiàn)在需求有變,我們在這里要使用一種新的斧頭潜的,即Axe有一個新的實現(xiàn)類SteelAxe骚揍,那么就必須修改這里的代碼,SteelAxe axe = new SteelAxe();這對于代碼維護其實并不方便。對于這個問題信不,Spring的解決方案是將上面的步驟放在了配置文件中年嘲叔,具體做法如下:
首先創(chuàng)建一個配置文件bean.xml? :
有了這個配置文件之后,Spring就可以在底層利用java反射抽活,首先創(chuàng)建出兩個類對象(PersonImpl和AxeImpl)硫戈,接著馬上執(zhí)行對象的setter方法,依據(jù)配置文件中各個類的依賴關(guān)系去初始化每個對象的屬性下硕,而這個過程丁逝,正是上面?zhèn)鹘y(tǒng)編程中的AxeImplaxe = new AxeImpl();
p.setAxe(axe);這兩步!
下面看看Spring方式在測試代碼中的寫法梭姓,
執(zhí)行結(jié)果:
可以看到霜幼,在測試代碼中,完全沒有了PersonImpl和AxeImpl兩個類的耦合依賴關(guān)系誉尖,轉(zhuǎn)而將依賴關(guān)系放在了上面的XML文件中罪既,底層通過java反射的方式進行初始化。
即铡恕,將java代碼中對象間的依賴關(guān)系的控制權(quán)交給了Spring配置文件琢感,由Spring來生成對象,并且設(shè)置對象間的依賴關(guān)系探熔,這就是控制反轉(zhuǎn)(IOC)或者叫依賴注入(DI)驹针。
Spring自動生成對象(可禁用)和設(shè)置依賴關(guān)系是最基本的功能。
Spring的IOC(或DI)機制祭刚,極大地降低了組件間的耦合牌捷,例如對于上面的需求變更墙牌,我們只需要在XML文件中新增一個bean節(jié)點涡驮,并設(shè)置好依賴關(guān)系即可,而測試代碼不需要任何改變喜滨!
新增Axe的實現(xiàn)類:
修改bean.xml配置文件:
執(zhí)行測試類結(jié)果:
5.設(shè)值注入(set)和構(gòu)造注入(constructor)
對于依賴注入捉捅,有兩種方式,一種是設(shè)置注入虽风,即上面XML配置文件中設(shè)置<property />標(biāo)簽的方式棒口,這種方法本質(zhì)上是利用反射調(diào)用對象的setter方式進行初始化。
另外辜膝,還可以使用構(gòu)造注入的方式无牵,即在XML配置文件中使用<constructor-arg />標(biāo)簽,不過這種方式要求有對應(yīng)的構(gòu)造方法才行厂抖。
對于上面的例子茎毁,首先我們要讓PersonImpl類有一個構(gòu)造方法,
接著我們將XML配置文件中的<peroperty>標(biāo)簽用<constructor-arg>標(biāo)簽替換,
我們將得到一樣的結(jié)果七蜘,只是實現(xiàn)的方式不一樣而已谭溉。對于設(shè)值注入和構(gòu)造注入兩種方式如何選擇呢?
一般的情況下橡卤,如果對依賴關(guān)系無需變化地注入扮念,盡量采用構(gòu)造注入。其他依賴關(guān)系的注入則考慮采用設(shè)值方式注入碧库。