應用層Spring框架技術及系統(tǒng)架構_第1頁
應用層Spring框架技術及系統(tǒng)架構_第2頁
應用層Spring框架技術及系統(tǒng)架構_第3頁
應用層Spring框架技術及系統(tǒng)架構_第4頁
應用層Spring框架技術及系統(tǒng)架構_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第1章 應用層Spring框架技術及系統(tǒng)架構Spring 框架技術實際上是 Rod Johnson 在 Expert One-on-One J2EE Design and Development 一書中所闡述的設計思想的具體實現(xiàn)。Spring框架為J2EE平臺的開發(fā)者提供的是一種“對象管理”技術,也就是為開發(fā)者解決包括 對象的生命周期、對象之間的依賴關系建立、對象的緩存實現(xiàn)等方面問題的 管理技術。Spring框架是一個輕量級的控制反轉(IoC)技術和面向切面編程 (AOP )技術的容器框架,利用Spring框架中的IoC技術可以實現(xiàn)J2EE平臺中所倡導的由容器實現(xiàn)對象的生命周期管理,而利用Sp

2、ring框架中的AOP技術可以實現(xiàn)J2EE平臺中所倡導的分離應用系統(tǒng)中業(yè)務邏輯組件和通用的技術服 務組件。應用系統(tǒng)的開發(fā)者在應用系統(tǒng)中應用Spring框架后能夠達到“解耦”和“脫離容器”的設計和實現(xiàn)的目的。本章重點介紹應用層 Spring框架技術及系統(tǒng)架構,主要涉及Spring框架 的特性、Spring框架的IoC和DI以及Spring IoC與GoF設計模式的工廠模 式的對比;同時也還介紹Spring框架的架構的特性以及Spring框架的設計目標等方面的內容;最后再通過具體的應用示例實現(xiàn),讓讀者體驗Spring框架中IoC技術給應用系統(tǒng)的開發(fā)所帶來的便利。1.1 應用層Spring框架技術Q

3、.1.1 Spring框架的特性)1 .關于 Rod Johnson 的 Expert One-on-One J2EE Design and Development 一書Spring框架技術起源于 Spring框架的主設計者 Rod Johnson的Expert One-on-One J2EE Design and Development 一書,此書已經由電子工業(yè)出版社出版,翻譯版 名為J2EE設計開發(fā)編程指南,參見圖1.1中某圖書網站對該書的簡要介紹。分類檢察:賽舍 C/TurLo C - C+ - VE * BASIC/Qbasi c - JAA-J2EE設計開發(fā)編程指南華儲除推薦1之序的

4、輕驗著作魚6血咨2=白血魚J2EEwi tliSiit EJI中文版)國福編導:ISEM條形嗎;97875IKKfl印數(shù) :707*1出于社:電子工業(yè)出版社制出版社:林叱:(J Hoi Johns tut/譯者:既每律等了出版日期:會期年T月圖1.1J2EE設計開發(fā)編程指南一書的簡要介紹同時,一種新的Java框架技術Spring框架技術也相應發(fā)布,Spring框架技術也出自 Rod Johnson 之手。2) Spring框架技術的產生Spring 框架技術實際上是Rod Johnson 在 Expert One-on-One J2EE Design andDevelopment一書中所闡述的

5、設計思想的具體實現(xiàn)。在該書中, Rod Johnson倡導J2EE實 用主義的設計思想,并隨書提供了一個初步的開發(fā)框架實現(xiàn),也就是Interface21開發(fā)軟件包。Spring框架技術正是這一思想的全面和具體的體現(xiàn)。3) Spring框架的設計者 Rod JohnsonRod Johnson在Interface21開發(fā)包的基礎之上,進行了進一步改造和擴充,使其發(fā)展 成為一個更加開放、清晰、全面、高效的 J2EE平臺中的應用層開發(fā)框架。4) . Spring框架屬于應用層框架1) Spring框架提供的是一種“對象管理”技術在Spring框架中為應用系統(tǒng)的開發(fā)者提供的是“對象管理”技術,也就是為

6、開發(fā)者解 決包括對象的生命周期、對象之間的依賴關系建立、對象的緩存實現(xiàn)等方面問題的管理技 術。而“對象管理”是每個面向對象編程的程序員都要面臨的問題,將程序員從煩瑣、單 調和重復的編程工作中解脫出來,正是Spring框架的價值所在。2) Spring框架技術的目標是實現(xiàn)一個全方位的整合框架在Spring框架中包含有多個不同的子框架(或者稱為組件),比如Spring AOP、SpringDAO、Spring ORM、Spring Web和Spring MVC 等。而這些子框架之間彼此可以獨立,也 可以使用其他的第三方框架方案替代其中的某個子框架。因為Spring框架采用的是分層設計的架構,這樣將

7、允許系統(tǒng)開發(fā)者獨立地應用各個子框架來構建應用系統(tǒng)或者結合已有的 其他框架共同構建應用系統(tǒng)。3) .傳統(tǒng)的J2EE系統(tǒng)開發(fā)技術在現(xiàn)今的應用開發(fā)中所面臨的問題1) J2EE技術及發(fā)展回顧J2EE技術平臺的標準化特性大大提升了企業(yè)級應用系統(tǒng)開發(fā)的開放程度,并且得到了整個行業(yè)和眾多上下游廠商、開發(fā)者的廣泛認可。同時憑借Java語言所具有的平臺無關性 對當時的企業(yè)級應用系統(tǒng)的開發(fā)產生了 一定的促進作用。然而,J2EE在一些應用方面也表現(xiàn)出不盡如人意之處,如低效、復雜以及依賴容器等導致應用系統(tǒng)的開發(fā)成本比較高、系統(tǒng)開發(fā)周期比較長。對 J2EE平臺的一些相關技術不 滿意的呼聲也漸漸出現(xiàn)。2) J2EE技術平

8、臺(EJB)的主要問題 由于要采用多層架構設計和實現(xiàn),因此如果應用系統(tǒng)設計不良好時,將導致系統(tǒng)編 碼實現(xiàn)比較復雜、單元測試比較難實施,并且無法有效控制開發(fā)周期。 由于可選擇和可應用的相關技術太多,以及應用范圍太大,而導致開發(fā)者在學習方 面的成本比較高,需要系統(tǒng)地學習和掌握各個方面的相關知識,無法使初學者快速 上手和迅速進入開發(fā)狀態(tài)。 另外,早期的J2EE平臺中的標準技術只注重中、大型企業(yè)級系統(tǒng)的應用開發(fā)和實 現(xiàn),而忽視小型系統(tǒng)的開發(fā)和實現(xiàn)的需求,不容易開發(fā)和實現(xiàn)可伸縮性好的中、小 型系統(tǒng)。合理并正確應用 J2EE技術平臺中的各個方面的應用技術來開發(fā)系統(tǒng),其實并不是一 件輕松的事情,因為開發(fā)者在

9、應用某些具體的技術時需要仔細考慮和權衡各種技術的具體 應用,以及應用某種技術后,可能會給應用系統(tǒng)帶來的各種可能的負面作用。3)拒絕使用EJB組件技術并不意味著拒絕 J2EE平臺中一些良好的思想和解決方案J2EE平臺下的企業(yè)級應用系統(tǒng)的開發(fā)者所要明確的是,拒絕使用EJB組件技術并不意味著拒絕J2EE平臺中一些良好的解決方案和優(yōu)秀的設計思想。比如,對象的生命周期 管理、容器提供基礎功能服務(達到分離應用組件和基礎服務組件的思想)等。每個企業(yè)應用系統(tǒng)都需要這些基礎服務。但開發(fā)者應該如何利用現(xiàn)有的框架來提供這 些基礎服務以減輕企業(yè)在信息化系統(tǒng)建設方面投資的負擔呢?伴隨著這個問題的提出,一 個輕量級的J

10、2EE解決方案出現(xiàn)了: 是否可以在輕量級平臺中應用J2EE EJB組件中的各種核心技術?4.利用Spring IoC 和AOP實現(xiàn)J2EE EJB類似的主要技術Spring框架是一個輕量級的控制反轉(IoC)技術和面向切面編程(AOP )技術的容器 框架。在Spring框架技術中又是如何實現(xiàn)類似EJB組件的主要技術特性呢?1)標準J2EE技術平臺中的主要的核心思想 容器實現(xiàn)對象的生命周期管理。 分離應用邏輯組件和通用服務組件。 應用服務器容器可以管理各個組件的事務并可以跨組件的隔離(如EJB CMT特性)。2)利用Spring框架中的IoC實現(xiàn)J2EE平臺中所倡導的由容器實現(xiàn)對象的生命周期 管

11、理 Spring框架技術中提供了 IoC (控制反轉)機制,借助于依賴注入設計模式,使得 開發(fā)者不再需要自己來管理所依賴的目標對象自身的生命周期及其關系,這樣能夠 改善開發(fā)者對J2EE和GoF設計模式中的各種模式的具體應用。 由于Spring IoC中所要求的 JavaBean組件類為普通的 Java類(Plain Ordinary Java Object, POJO),而不像EJB組件那樣必須實現(xiàn)某個特定接口的要求,從而達到了 輕量級的實現(xiàn)目標。3)利用Spring框架中的AOP實現(xiàn)J2EE平臺中所倡導的分離應用邏輯組件和通用服 務組件 借助于Spring框架技術中所提供的 Spring A

12、OP,能夠達到類似“容器”提供基礎功 能服務的目標。 因為借助于Spring AOP中所提供的各種攔截器(Interceptor)和各種通知(Advice) 技術,開發(fā)者能夠實現(xiàn)以聲明式的方式來使用企業(yè)級服務,比如安全性服務、事務 服務、緩存服務等。在Spring框架中為什么要提供對 AOP的具體實現(xiàn)?除了上述兩個方面的目的以外, 還允許用戶實現(xiàn)自定義的切面功能,用Spring AOP中所提供的各種類型的通知和攔截器來進一步完善面向象的編程(OOP)技術的應用。4 ) Spring IoC和Spring AOP組合在一起形成了完整的Spring框架技術沒有Spring IoC的Spring A

13、OP是不完整的, 當然沒有 Spring AOP的Spring IoC ,其最 終的結果將是不健壯的。因此,可以這樣認為:Spring框架=IoC + AOP。5 .基于Spring框架的應用系統(tǒng)開發(fā)所體現(xiàn)出的主要的優(yōu)點:“解耦”和“脫離容器”1)對于系統(tǒng)設計者能夠在設計方面達到“松耦合”的系統(tǒng)設計目標(1) “松耦合”的系統(tǒng)設計目標。“松耦合”的系統(tǒng)設計一方面主要體現(xiàn)在應用系統(tǒng)中的各個部分之間(包括應用系統(tǒng) 的核心類代碼之間、應用系統(tǒng)與其所在的框架平臺之間)盡量形成一種松耦合的結構,這 使得應用系統(tǒng)具有更好的靈活性和可擴展性;另一方面也體現(xiàn)在應用系統(tǒng)與其所在的底層 應用服務器平臺的解耦上。(

14、2)在Spring框架中如何實現(xiàn)上面兩種形式的解耦。應用系統(tǒng)內部的類之間的解耦主要通過一種稱為控制反轉(IoC)的技術來實現(xiàn),應用系統(tǒng)與底層應用服務器平臺的解耦則是借助其所提供的Spring AOP技術來實現(xiàn)。因為在Spring框架中內置了對 AOP的具體實現(xiàn),這將使得一些本來必須由J2EE應用服務器容器所支持的功能,比如事務管理控制、安全管理和身份驗證等方面的技術實現(xiàn)可以脫離 J2EE應用服務器容器而能夠在容器外的普通Java虛擬機(JVM )環(huán)境中運行。2)對于系統(tǒng)實現(xiàn)者能夠簡化J2EE平臺中的一些復雜的應用實現(xiàn)技術,并養(yǎng)成“面向接口編程實現(xiàn)”的良好的編程習慣1 利用其對象“延時依賴注入”

15、思想組裝代碼和建立代碼之間的關系,這樣一方面減 少了在使用這些對象的客戶程序中的大量代碼,另一方面也提高應用系統(tǒng)的擴展性 和靈活性,最終真正地實現(xiàn)插件式編程和開發(fā)實現(xiàn)。2 利用Spring框架對AOP的具體支持,達到集中處理應用系統(tǒng)中的業(yè)務邏輯并分離 附加技術支持和實現(xiàn)的代碼,從而減少代碼的重復以構建出簡潔和優(yōu)雅的解決TzT 7K o3 利用Spring框架對其他框架的支持,比如對Hibernate的SessionFactory組件、事務管理等方面的封裝,更簡潔地應用和集成Hibernate等O/R Mapping框架和其他的框架技術(如 Struts等)。3)如果開發(fā)者不應用Spring框架

16、及其各個相關的組件,將額外需要編程實現(xiàn)許多代碼同時這些代碼與由 Spring框架提供的功能相比效果又怎樣?比如事務處理、JDBC數(shù)據(jù)庫訪問等實現(xiàn)??赡軙霈F(xiàn)“花了精力但效果不好”的局面。根據(jù)AOP中所倡導的分離應用系統(tǒng)中的核心關注點和橫切關注點的基本原則,計算 機的應用開發(fā)者應該更多地把主要精力放在應用系統(tǒng)的業(yè)務邏輯功能的實現(xiàn)方面,以便交 付出有業(yè)務價值的信息化系統(tǒng);而不應該過多地花費時間和精力來解決普通的計算機應用 中的技術問題,如事務管理、安全管理、對象緩存和數(shù)據(jù)庫連接池等技術的實現(xiàn)。(1.1.2Spring 框架中的 IoC 和 DI J1 . Spring框架中的IoC1)控制反轉(I

17、nversion of Control , IoC)所謂控制反轉,就是將應用系統(tǒng)中原來由程序控制“對象之間的關系”轉交給由外部 容器來實現(xiàn)控制。借助于控制反轉的機制,能夠實現(xiàn)由容器控制程序中的各個類之間的關 系,而非傳統(tǒng)形式的編程實現(xiàn)中直接在程序代碼中由程序代碼操控各個類對象實例之間的 關系。這就是“控制反轉”的概念:控制權由應用系統(tǒng)中的程序代碼轉移到了外部容器???制權的轉移,即“控制反轉”;利用“控制反轉”能夠減少對象的請求者對服務提供者的特 定實現(xiàn)邏輯的依賴,因為應用系統(tǒng)中的各個組件類不再需要去查找或是實例化它們所依賴 的其他目標組件類。2 ) IoC是一種使應用程序邏輯外在化的設計模式

18、在這種編程模式下,提供服務的目標組件是被“注入”的而不是被“直接寫入”到請 求者(客戶端)的代碼中;這樣將大大減少對象的請求者對服務提供者的特定實現(xiàn)邏輯的 依賴。因為開發(fā)者已經將依賴的具體“定位信息”和“關系信息”從請求者中分離出來了, 而在Spring框架中則是將它們放在 IoC的*.XML的配置文件中。3)應用Spring框架中的IoC進行系統(tǒng)開發(fā)時的基本要求為了能夠更好地應用 Spring框架中的IoC技術,對開發(fā)者在具體編程方面也有一定的 要求。也就是在代碼中不應該再直接創(chuàng)建出目標對象的實例,而應該只描述出創(chuàng)建它們的 方式。即在代碼中不直接與服務對象連接,但需要在配置文件(一般為*.X

19、ML文件)中描述出應用系統(tǒng)中的哪一個功能組件需要哪一項服務。應用系統(tǒng)中的組件類程序在運行時,由容器(在 Spring框架中是指IoC容器)負責將這些對象關聯(lián)在一起,并依據(jù)調用關系 將目標對象注入。4)應用Spring框架中的IoC的代碼示例在下面的Spring框架中的IoC的*.XML文件的示例中聲明了兩個對象,名稱分別為 theUpperAction和theLowerAction 。在運行過程中,由 Spring框架中的IoC容器并分別為 該兩個對象動態(tài)注入屬性字符串值。請參見【例 1-1】中的代碼,并請注意其中黑體部分的 代碼。例 1-1應用Spring框架中的IoC容器的代碼示例。)&l

20、t;?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-SPRINGDTD BEAN 2.0/EN""/dtd/spring-beans-2.0.dtd"><beans><bean id=" theUpperAction實例化配置的對象,以配置文件的bean 節(jié)點ID值作為實例引用的關鍵字class="com.px1987.spri

21、ngexample.springj2seapp.UpperTrnsferAction"><property name="messageProperty"><value>HeLLo,UpperAction </value>它會被動態(tài)地注入到UpperTrnsferAction的messageProperty屬性中theLowerAction " class="com.px1987.springexample.</property></bean><bean id="

22、springj2seapp.LowerTrnsferAction"><property name="messageProperty"><value>HeLLo,LowerAction </value>r它會被動態(tài)地注入到LowerTrnsferAction的messageProperty屬性中</property></beans></bean>2. Spring框架中的依賴注入 DI技術1)依賴注入(Dependency Injection , DI)是對IoC的另一種描述當初Rod J

23、ohnson提出IoC的概念時,曾經引起業(yè)界的爭論。因為在 IoC的概念中沒 有具體說明如何實現(xiàn)控制反轉、反轉給誰以及在什么時候進行控制反轉等方面的問題。正在業(yè)界為IoC的概念爭論不休時, 大師級人物 Martin Fowler發(fā)表了一篇經典文章 Inversion of Control Containers and the Dependency Injection pattern 為 IoC 正名,至止匕,IoC 又獲得了 一個新的名字 依賴注入( Dependency Injection )oDependency Injection是依賴注入的意思,也就是將應用系統(tǒng)中的各個類之間的依賴關

24、系先剝離(也就是常說的解耦或者分離),然后在應用系統(tǒng)運行過程中根據(jù)應用之間的調用關系再適時地注入到目標系統(tǒng)中。2)什么是依賴注入根據(jù)上面的說明,相對于 IoC而言,“依賴注入”更加準確地描述了IoC的設計理念。從名字上來直接理解,所謂依賴注入,即組件之間的依賴關系由容器在應用系統(tǒng)運行期來 決定,也就是由容器動態(tài)地將某種依賴關系的目標對象實例注入到應用系統(tǒng)中的各個關聯(lián) 的組件之中。class CPU class HardDisk class Printer class UserInfo 【例1-2】 中給出了計算機 Computer類與其他各個類之間的各種關系的示例。在傳統(tǒng) 的應用開發(fā)中,需要開

25、發(fā)者自己在 Computer類中分別創(chuàng)建出各個依賴的目標類的對象實 例,如CPU和Printer類對象等,這樣將使得 Computer類與它所依賴的各個目標類之間產 生緊密耦合關系。3 ) IoC和DI的本質都是改變依賴關系組件類和組件類之間的關系依賴由原來的依賴“目標組件”改變?yōu)楝F(xiàn)在的依賴于“IoC容器”。為什么要進行如此的改變?(1)為什么不應該直接依賴應用系統(tǒng)中的“目標組件”?依賴在應用系統(tǒng)中是客觀存在的,如果應用系統(tǒng)中不存在依賴關系,就意味著應用系 統(tǒng)是由各個相互孤立的模塊或者組件所構成,這是無法構成一個相互協(xié)作和互相配合的有 機整體的。問題是應該依賴誰?根據(jù)Spring框架中的IoC

26、的設計原理,應用系統(tǒng)中的某個組件類 應該依賴所在的上層容器而不要直接依賴目標組件類。主要是由于目標組件類有可能會隨 著應用系統(tǒng)的需求變化而經常會發(fā)生改變和調整,開發(fā)者當然也不希望在應用系統(tǒng)中由于 某個“方面”發(fā)生改變而相關聯(lián)的各個組件類也必須隨之改變!J2EE平臺中倡導多層架構中分層的目的也就是希望能夠取得良好的隔離效果。(2)為什么可以依賴于“ IoC容器(Spring框架)” ?由于容器相對于應用系統(tǒng)本身而言應該是相對穩(wěn)定的,不會頻繁發(fā)生改變(當然, Spring框架本身也會發(fā)生升級改變)。這樣,也就達到了將應用系統(tǒng)中的“可變”和“不變”部分相互分離的目的。4 .在Spring框架中提出“

27、依賴注入”的設計理念1)主要目的軟件系統(tǒng)開發(fā)中的各種理論、思想包括軟件工程等都一直在提倡“軟件重用”,但問題是如何能夠重用?以及采用什么樣的具體實現(xiàn)方法? Spring框架中所提出的“依賴注入”的設計理念為“軟件重用”的真正實現(xiàn)帶來了可操作的實現(xiàn)方法。依賴注入的目標并非為軟件系統(tǒng)帶來更多的功能,應用它的目的是為了提升“組件重 用”的概率,同時也為應用系統(tǒng)搭建出一個更加靈活的、可擴展的平臺。因為,現(xiàn)在的企 業(yè)級應用系統(tǒng)的開發(fā)更加注重系統(tǒng)的安全性、穩(wěn)定性、可擴展性和可移植性等目標。2)應用依賴注入的設計理念在系統(tǒng)架構設計方面所產生的效果提高了組件的可移植性和可重用度,依賴注入機制減輕了組件之間的依

28、賴關系,因為目標對象的創(chuàng)建并不是在源組件類中直接以編碼方式產生的,這也是遵守J2EE平臺倡導的“松耦合”的系統(tǒng)開發(fā)要求的。3)應用依賴注入的設計理念在系統(tǒng)開發(fā)實現(xiàn)方面所產生的效果能夠更簡潔地編程應用J2EE平臺中的各種復雜的技術實現(xiàn),并使應用系統(tǒng)具有良好的可擴展性和靈活性。下面通過一個在應用系統(tǒng)的持久層開發(fā)實現(xiàn)中DAO組件中應用DataSource實現(xiàn)數(shù)據(jù)庫連接的示例,來說明 Spring框架中的依賴注入是如何簡化系統(tǒng)開發(fā)實現(xiàn)的。例 1-3 某個DAO組件獲得 DataSource對象從而獲得數(shù)據(jù)庫連接對象的示例。:<?xml version="1.0" encodi

29、ng="UTF-8"?><!DOCTYPE beans PUBLIC "-SPRINGDTD BEAN 2.0/EN""/dtd/spring-beans-2Odtd"><beans><beanid="dataSource"class="mons.dbcp.BasicDataSource"</property><property name="url"><

30、value></value></property>定義出目標數(shù)據(jù)庫的連接參數(shù)及賬號destroy-method="close"<property name="driverClassName"><value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>BasicDataSource 是 Apache 的DBCP數(shù)據(jù)庫連接池的實現(xiàn)jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName

31、=WebStudyDB<property name="username"><value>sa</value></property><property name="password"><value>1234</value>上面的示例是將 Apache DBCP的數(shù)據(jù)庫連接池的實現(xiàn)類BasicDataSource的對象實例注入到應用系統(tǒng)的 DAO組件中,從而避免由應用系統(tǒng)的開發(fā)者自己編程實現(xiàn)基于JDBC 2.0的DataSource接口的實現(xiàn)。我們知道,對于數(shù)據(jù)庫連接池的具體

32、編程實現(xiàn)不是所有的開發(fā) 者都有能力完成的,因為它要考慮許多開發(fā)和線程同步等方面的技術,這是有一定的技術 復雜性和難度的。4)在系統(tǒng)的可維護性方面所產生的效果提高了應用系統(tǒng)的可移植性和可維護性。當應用系統(tǒng)中的某一環(huán)境參數(shù)發(fā)生變化,并 不需要大量地修改程序中的代碼,而只需要調整配置文件及配置文件中的參數(shù)。比如對于 【例1-3】中的示例,如果應用系統(tǒng)的數(shù)據(jù)庫連接池是在應用系統(tǒng)的部署環(huán)境中實現(xiàn)的,那 么最終實際是采用應用容器的JNDI形式的數(shù)據(jù)庫連接池的實現(xiàn)方案,此時只需要更新DataSource對象的實例的定義,而不需要修改應用系統(tǒng)中的DAO組件中的有關代碼。請見下面如【例1-4】所示的最后修改結果

33、。例 1-4應用容器的JNDI數(shù)據(jù)庫連接池的實現(xiàn)的示例,請注意其中黑體部分的代碼。)<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-/SPRING/DTD BEAN 2.0/EN""/dtd/spring-beans20.dtd"><beans><bean id="dataSource"連接池的實現(xiàn)交給容器class=&

34、quot;org.springframework.indi.JndiObjectFactoryBean"><property name="jndiName"><value></property></bean>java:/comp/env/jdbc/dataSource</value><bean id="userInfoDAOBean"在容器中所定義出的連接池的 dataSource 名稱class="com.px1987.springexampl.dao.User

35、InfoDAOBean"><property name="dataSource"> <ref bean="dataSource"/></property></bean></beans>其中UserInfoDAOBean組件假設是一個運行在 J2EE應用服務器容器,如Weblogic或 者Tomcat等中的組件,而DataSource是由J2EE應用服務器容器所創(chuàng)建的。系統(tǒng)中的DAO組件在運行過程中將由Spring IoC容器動態(tài)注入,而 DataSource的具體配置和初始化工作

36、也將由IoC容器在運行期完成。因此,從上面的兩個示例的最終實現(xiàn),對比傳統(tǒng)的如通過編碼初始化DataSource對象實例的實現(xiàn)方式,基于依賴注入的系統(tǒng)實現(xiàn)是相當靈活和簡潔的。5 .從上面的示例所反映出的編程實現(xiàn)的效果通過依賴注入機制,開發(fā)者只需要通過簡單地配置,無須任何編程實現(xiàn)代碼就可在應 用系統(tǒng)的 UserInfoDAOBean 組件中獲得所需要的DataSource對象實例。也就是說,UserInfoDAOBean組件的開發(fā)者只需利用容器注入的DataSource對象實例,完成自身的數(shù)據(jù)訪問的各種CRUD的訪問邏輯,而不用關心應用系統(tǒng)中后臺具體的數(shù)據(jù)源來自何處、采用什么形式的具體技術實現(xiàn)等方

37、面的問題。1)提高了組件的可移植性和可重用度假設應用系統(tǒng)的部署環(huán)境發(fā)生了變化,應用系統(tǒng)的持久層中的各種形式的DAO組件需要脫離應用服務器容器 (在容器之外)獨立運行。由于失去了容器的支持,原本通過JNDI獲取DataSource的方式不再有效,現(xiàn)在則需要改變?yōu)橛赡硞€第三方的數(shù)據(jù)庫連接池的實現(xiàn) 組件(如 Apache的DBCP)直接提供 DataSource。此時,開發(fā)者需要如何進行修改以適應新的系統(tǒng)運行環(huán)境的要求?很簡單,只需要修 改應用系統(tǒng)中的 DataSource的配置為如 【例1-3】所示的配置效果。 從而使系統(tǒng)的 DAO組 件可以在容器之內和容器之外自由地移植和切換。從這個角度來看,系

38、統(tǒng)的DAO組件是可重用的。2)依賴注入機制減輕了組件之間的依賴關系回顧傳統(tǒng)的編程技術中的編碼模式,如果要進行同樣的修改和滿足同樣的結果要求, 開發(fā)者則需要付出比較多的努力,完成大量編程修改工作。因此,依賴注入機制減輕了組 件之間的依賴關系,同時也大大提高了組件的可移植性,這意味著,組件得到重用的幾率 將大大提高。(1.1.3Spring IoC與工廠模式的對比/6 . GoF設計模式中的工廠模式也能夠達到類似 Spring IoC的效果1)應用IoC和DI的設計理念對應用系統(tǒng)帶來的影響將類之間的依賴關系轉移到應用系統(tǒng)的外部配置文件中,從而避免在調用類中以硬編 碼方式產生出實現(xiàn)類。也就是能夠減少

39、“服務請求者”對“服務提供者”的特定實現(xiàn)邏輯的依賴。2)為達到上面相同的效果的常規(guī)開發(fā)實現(xiàn)方式是利用工廠模式在以往的開發(fā)實現(xiàn)的技術中,通常是利用GoF設計模式中的工廠(Factory)模式來解決此類問題。利用工廠模式使外部調用類也就是客戶端類不需要關心服務提供者的具體實 現(xiàn),這非常適合在同一個事物類型具有多種不同實現(xiàn)的情況下使用,以隔離對象的創(chuàng)建者 和對象的使用者。7 .利用工廠模式分離在創(chuàng)建對象方面的依賴關系為了能夠讓讀者了解為什么要應用工廠模式,以及應用工廠模式給應用系統(tǒng)所帶來的 效果。下面通過一個示例的演變過程來加以說明,并考察一個UserManagerImple類和MySQLDAOIn

40、terfaceImple 類的依賴關系。1)兩個類之間直接產生依賴關系【例1-5】中的用戶管理類UserManagerImple及其對應的DAO 組件 MySQLDAOInterfaceImple 類之間直接產生依賴關系。例 1-5 兩個類之間直接產生依賴關系的代碼示例,請注意其中黑體部分的代碼。)package com.px1987.springwebapp.model;import com.px1987.springwebapp.dao.*;public class UserManagerImple implements UserManagerInterface MySQLDAOInter

41、faceImple daoOperatorDBBean=null;public UserManagerImple。 public boolean doUserLogin(UserInfoVO oneUserInfo) daoOperatorDBBean=new MySQLDAOInterfaceImple。;String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.getUserPassWord();boolean okOrNot=false;UserInfoVO returnOneUserInfo=da

42、oOperatorDBBean.getOneUserInfo(userName,userPassWord);if(returnOneUserInfo=null)okOrNot = false;else okOrNot = true;return okOrNot; 從上面 的代碼示例可以看出,UserManagerImple 類直接依賴于 MySQLDAOInterfaceImple 類,這個依賴關系意味著當MySQLDAOInterfaceImple 類修改時或者被替換為其他類型的DAO 組件時,UserManagerImple類也會受到影響。同時也違反Robert C.Martin在其敏捷軟

43、件開發(fā)中所描述的依賴倒置原則( Dependency Inversion Principle, DIP ), “高層模塊不應該依賴于低層模塊,兩者都應該依賴于抽象;抽象不應該依賴于具體實現(xiàn), 細節(jié)應該依賴于抽象”。2)利用接口來消除 UserManagerImple類對 MySQLDAOInterfaceImple類的直接依賴例,1-6 利用 DAO 組件的接口 DAOInterface 來隔離兩者之間的依賴關系的代碼示例,)請注意其中黑體部分的代碼。*,package com.px1987.springwebapp.model;import com.px1987.springwebapp.d

44、ao.public class UserManagerImple implements UserManagerInterface DAOInterface daoOperatorDBBean=null,public UserManagerImple。public boolean doUserLogin(UserInfoVO oneUserInfo) daoOperatorDBBean=new MySQLDAOInterfaceImple(); String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.ge

45、tUserPassWord(); boolean okOrNot=false;UserInfoVO returnOneUserInfo=daoOperatorDBBean.getOneUserInfo(userName, userPassWord);if(returnOneUserInfo=null) okOrNot = false;else okOrNot = true;經過這樣的優(yōu)化設計后,雖然其中的 兩者之間不再存在直接的依賴關系,但是 類之間還是在對象創(chuàng)建方面存在依賴關系。return okOrNot;UserManagerImple 和 MySQLDAOInterfaceImpleU

46、serManagerImple 和 MySQLDAOInterfaceImple為了解決這種對象創(chuàng)建方面的依賴關系,經典的GoF設計模式中提供了工廠(Factory)模式,將對象的創(chuàng)建交給工廠模式中的工廠類來 創(chuàng)建。從而也能夠達到隔離對象的創(chuàng)建者和對象的使用者的效果。8 .用工廠模式來實現(xiàn)類似IoC效果的示例根據(jù)GoF設計模式中的工廠模式的編程規(guī)則,需要定義出下面的各個角色:產品類的 接口、產品類的接口的實現(xiàn)、工廠類和調用者客戶類。當然,關于工廠模式的更進一步的 說明參見本書第11章。1)產品的接口定義【例1-7】中的DAOInteface.java代碼代表應用系統(tǒng)中的DAO接口(也就是工廠模

47、式中的某種產品類的接口,它代表所要創(chuàng)建的對象應該具有的功能要求定義)。例1-7工廠模式中的產品類(DAO接口 DAOInteface )的接口代碼示例?!?rpackage com.px1987.springwebapp.dao;import java.sql. *;import com.px1987.springwebapp.model.*;public interface DAOInterface public UserInfoVO getOneUserInfo(String userName,StringuserPassWord);public boolean insertOneUser

48、Info(UserInfoVO oneUserInfoVO);public boolean deleteOneUserInfo(int userID);public boolean updateOneUserInfo(UserInfoVO newUserInfoVO);2)產品的接口的各個實現(xiàn)類定義【例 1-8】中的 MySQLDAOInterfaceImple.java 和【例 1-9】中的 OracleDAOInterface- Imple.java分別代表上面產品接口的不同的產品實現(xiàn)類,也就是應用系統(tǒng)中所需要創(chuàng)建的 各個目標對象的類。限于篇幅,這里僅對其中的兩個方法給出具體的實現(xiàn)代碼。礴

49、1-8工廠模式中產品類接口的某個實現(xiàn)類的代碼示例。一)package com.px1987.springwebapp.dao;import com.px1987.springwebapp.model.UserInfoVO;import java.sql. *;import javax.sql.*;public class MySQLDAOInterfaceImple implements DAOInterface public MySQLDAOInterfaceImple。 public boolean deleteOneUserInfo(int userID) public UserInfo

50、VO getOneUserInfo(StringuserName,String userPassWord)public boolean insertOneUserInfo(UserInfoVO oneUserInfoVO) public boolean updateOneUserInfo(UserInfoVO newUserInfoVO) 例 1-9工廠模式中產品類接口的某個實現(xiàn)類的代碼示例。_)package com.px1987.springwebapp.dao;import com.px1987.springwebapp.model.UserInfoVO;import java.sql.

51、 *;import javax.sql.*;public class OracleDAOInterfaceImple implements DAOInterface public OracleDAOInterfaceImple。 public boolean deleteOneUserInfo(int userID) public UserInfoVO getOneUserInfo(StringuserName,String userPassWord)public boolean insertOneUserInfo(UserInfoVO oneUserInfoVO) public boolea

52、n updateOneUserInfo(UserInfoVO newUserInfoVO) 3)工廠類的定義【例1-10中的DAOBeanFactory.java代表工廠類,利用它可創(chuàng)建出不同類型的產品對 象,這些產品對象也就是客戶端程序對象所需要的目標對象。對本示例而言,則是在業(yè)務 層組件中實際所需要的某個目標DAO組件對象的實例,由工廠類根據(jù)業(yè)務層組件的具體需要返回產品接口 (也就是本示例中的DAOInterface接口)的不同產品實現(xiàn)類的對象實例。例 1-10工廠模式中的工廠類的代碼示例。jpackage com.px1987.springwebapp.dao; public class

53、 DAOBeanFactory public static DAOInterface creatorDAOBean(int requestDAOType) if (requestDAOType=1)return new OracleDAOInterfaceImple(); else if (requestDAOType=2)return new MySQLDAOInterfaceImple(); 在工廠模式中的工廠類通常是根據(jù)客戶請求時的參數(shù)(該參數(shù)代表所需要的不同產品 對象的實例)來判斷應該實例化哪個產品的實現(xiàn)類的對象實例,然后再返回該對象實例。4)請求者(客戶端)類【例1-11中的User

54、ManagerImple.java代表基于工廠模式的請求者,也就是客戶端程 序類,該類向工廠類發(fā)出需要某種形式的產品對象的請求,由工廠類返回某個特定的產品 對象實例給客戶程序。請注意其中黑體部分的代碼。例 1-11調用類(本示例為業(yè)務層組件類)的代碼示例。 package com.px1987.springwebapp.model;import com.px1987.springwebapp.dao.*;public class UserManagerImple implements UserManagerInterfaceDAOInterface daoOperatorDBBean=null

55、;public UserManagerImple() public boolean doUserLogin(UserInfoVO oneUserInfo) /可以將下面的類型“ 1 ”放到配置文件中,從而更加靈活daoOperatorDBBean=DAOBeanFactory.creatorDAOBean(1);String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.getUserPassWord();boolean okOrNot=false;UserInfoVO returnOneUserInfo=

56、daoOperatorDBBean.getOneUserInfo(userName, userPassWord);if(returnOneUserInfo=null)okOrNot = false; else okOrNot = true;return okOrNot;通過工廠模式,最終達到在請求者(客戶端)類的方法中實例化某個具體的產品實現(xiàn)類的對象一一本示例是在業(yè)務層中獲得所需要的某個具體的DAO組件類的對象實例,這樣對于調用類來說,不直接實例化該實現(xiàn)類而是由工廠類來創(chuàng)建產品對象(工廠模式中工廠類通常根據(jù)參數(shù)來判斷該實例化哪個實現(xiàn)類)。即使產品的某個實現(xiàn)類發(fā)生變化,而調用者的代碼仍然可以不做

57、修改,從而為維護與擴展帶來便利。應用系統(tǒng)中的其他組件需要獲取產品這個接口的實現(xiàn)類的對象實例,而無須事先獲知其具體實現(xiàn)類的編程實現(xiàn)細節(jié),從而也能夠達到隔離對象的創(chuàng)建者和對象的使用者的效果。9 .用Spring框架中的控制反轉(IoC)技術實現(xiàn)的示例1)定義出Spring框架中的IoC的XML配置文件在Spring框架中,是通過將各個對象實例的創(chuàng)建要求在其XML配置文件中加以定義,而最終由Spring框架中的IoC容器來幫助應用系統(tǒng)創(chuàng)建出所需要的各個目標對象?;?此,將本示例中所需要的各個對象實例加以定義出,請參見【例 1-12中的配置文件。例 1-12 Spring框架中的IoC的XML配置文

58、件的示例。 一)<?xml version="1.0" encoding="UTF-8"?>分別對各個產品對象進行聲明 也就是各個DAO組件對象<!DOCTYPE beans PUBLIC "-SPRINGDTD BEAN 2.0/EN""/dtd/spring-beans20.dtd"><beans><bean id="oracleDAOInterfaceImple" class="com.px1987.springwebapp.dao.OracleDAOInterfaceImple"></bean> <bean id="mySQLDAOInterfaceImple" class="com.px1987.springwebapp.dao. MySQLDAOInterfaceImple"></bean> <bean id="

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論