Spring框架應(yīng)用_第1頁
Spring框架應(yīng)用_第2頁
Spring框架應(yīng)用_第3頁
Spring框架應(yīng)用_第4頁
Spring框架應(yīng)用_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Spring框架應(yīng)用主要內(nèi)容Spring框架基本知識Spring框架開發(fā)準(zhǔn)備Spring框架開發(fā)實例1.1 Spring基本知識基本知識Spring是是Java平臺上一個開源應(yīng)用框架,它有著深厚的歷史根基。平臺上一個開源應(yīng)用框架,它有著深厚的歷史根基。Spring最初起源于最初起源于Rod Johnson于于2002年所著的年所著的Expert One-on-One:J2EE Design and Development一書中的基礎(chǔ)性代碼。在該書中,一書中的基礎(chǔ)性代碼。在該書中,Rod Johnson闡述了大量闡述了大量Spring框架的設(shè)計思想,并對框架的設(shè)計思想,并對J2EE平臺進(jìn)行了平臺

2、進(jìn)行了深層次的思考,指出了深層次的思考,指出了EJB存在的結(jié)構(gòu)臃腫的問題。他認(rèn)為采用一種輕量存在的結(jié)構(gòu)臃腫的問題。他認(rèn)為采用一種輕量級的、基于級的、基于JavaBean的框架就可以滿足大多數(shù)程序開發(fā)的需要。的框架就可以滿足大多數(shù)程序開發(fā)的需要。2003年,年,Rod Johnson公開了所描述框架的源代碼,這個框架逐漸演變公開了所描述框架的源代碼,這個框架逐漸演變成了我們所熟知的成了我們所熟知的Spring框架??蚣?。2004年年3月發(fā)布的月發(fā)布的1.0版本是版本是Spring的第的第一個具有里程碑意義的版本。這個版本發(fā)布之后,一個具有里程碑意義的版本。這個版本發(fā)布之后,Spring框架在框架

3、在Java社社區(qū)中變得異常流行?,F(xiàn)在,區(qū)中變得異常流行。現(xiàn)在,Spring已經(jīng)獲得了廣泛的歡迎,并被許多公司已經(jīng)獲得了廣泛的歡迎,并被許多公司認(rèn)為是具有戰(zhàn)略意義的重要框架。認(rèn)為是具有戰(zhàn)略意義的重要框架。1.1.1 Spring的基本概念的基本概念Spring框架是基于框架是基于Java平臺的,它為應(yīng)用程序的開發(fā)提供了全面的平臺的,它為應(yīng)用程序的開發(fā)提供了全面的基礎(chǔ)設(shè)施支持?;A(chǔ)設(shè)施支持。Spring專注于基礎(chǔ)設(shè)施,這將使得開發(fā)者能更好的專注于基礎(chǔ)設(shè)施,這將使得開發(fā)者能更好的致力于應(yīng)用開發(fā)而不用去關(guān)心底層的架構(gòu)。致力于應(yīng)用開發(fā)而不用去關(guān)心底層的架構(gòu)。Spring框架本身并未強(qiáng)制使用任何特別的編程

4、模式。從設(shè)計上看,框架本身并未強(qiáng)制使用任何特別的編程模式。從設(shè)計上看,Spring框架給予了框架給予了Java程序員許多自由度,但同時對業(yè)界存在的一程序員許多自由度,但同時對業(yè)界存在的一些常見問題也提供了規(guī)范的文檔和易于使用的方法。些常見問題也提供了規(guī)范的文檔和易于使用的方法。Spring框架的核心功能適用于任何框架的核心功能適用于任何Java應(yīng)用。在基于應(yīng)用。在基于Java企業(yè)平企業(yè)平臺上的大量臺上的大量Web應(yīng)用中,積極的拓展和改進(jìn)已經(jīng)形成。而應(yīng)用中,積極的拓展和改進(jìn)已經(jīng)形成。而Spring的的用途也不僅限于服務(wù)器端的開發(fā),從簡單性、可測試性和松耦合的用途也不僅限于服務(wù)器端的開發(fā),從簡單性

5、、可測試性和松耦合的角度來說,任何角度來說,任何Java應(yīng)用都可以從應(yīng)用都可以從Spring中獲得好處。中獲得好處。1.1.1 Spring的基本概念的基本概念1Spring框架優(yōu)勢Spring框架能有效地組織中間層對象??蚣苣苡行У亟M織中間層對象。Spring框架實現(xiàn)了真正意義上的面向接口編程,可實現(xiàn)組件之間的框架實現(xiàn)了真正意義上的面向接口編程,可實現(xiàn)組件之間的高度解耦。高度解耦。Spring所秉承的設(shè)計思想就是讓使用所秉承的設(shè)計思想就是讓使用Spring創(chuàng)建的那些應(yīng)用都盡可創(chuàng)建的那些應(yīng)用都盡可能少的依賴于它的能少的依賴于它的APIs。使用使用Spring構(gòu)建的應(yīng)用程序易于進(jìn)行單元測試。構(gòu)建

6、的應(yīng)用程序易于進(jìn)行單元測試。 Spring提高了代碼的可重用性,它盡可能避免在程序中硬編碼。提高了代碼的可重用性,它盡可能避免在程序中硬編碼。Spring為數(shù)據(jù)存取提供了一個一致的框架,簡化了底層數(shù)據(jù)庫的訪為數(shù)據(jù)存取提供了一個一致的框架,簡化了底層數(shù)據(jù)庫的訪問方式。問方式。1.1.1 Spring的基本概念的基本概念2依賴注入(DI)和控制反轉(zhuǎn)(IOC)依賴注入(依賴注入(Dependency Injection)和控制反轉(zhuǎn)()和控制反轉(zhuǎn)(Inversion of Control)實際上是同一個概念。)實際上是同一個概念。在傳統(tǒng)的程序設(shè)計中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例,而在在傳統(tǒng)的程序設(shè)

7、計中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例,而在依賴注入或控制反轉(zhuǎn)的定義中,調(diào)用者不負(fù)責(zé)被調(diào)用者的實例創(chuàng)建依賴注入或控制反轉(zhuǎn)的定義中,調(diào)用者不負(fù)責(zé)被調(diào)用者的實例創(chuàng)建工作,該工作由工作,該工作由Spring框架中的容器來負(fù)責(zé),它通過開發(fā)者的配置框架中的容器來負(fù)責(zé),它通過開發(fā)者的配置來判斷實例的類型,創(chuàng)建后再注入調(diào)用者。由于來判斷實例的類型,創(chuàng)建后再注入調(diào)用者。由于Spring容器負(fù)責(zé)創(chuàng)容器負(fù)責(zé)創(chuàng)建被調(diào)用者實例,實例創(chuàng)建后又負(fù)責(zé)將該實例注入調(diào)用者,因此稱建被調(diào)用者實例,實例創(chuàng)建后又負(fù)責(zé)將該實例注入調(diào)用者,因此稱為依賴注入為依賴注入(Dependency Injection);而被調(diào)用者的實例創(chuàng)建工作;

8、而被調(diào)用者的實例創(chuàng)建工作不再由調(diào)用者來創(chuàng)建而是由不再由調(diào)用者來創(chuàng)建而是由Spring來創(chuàng)建,因此稱為控制反轉(zhuǎn)來創(chuàng)建,因此稱為控制反轉(zhuǎn)(Inversion of Control)。1.1.1 Spring的基本概念的基本概念3面向切面編程(AOP)AOP(Aspect-Oriented Programming),也就是面向切面編程,它是面),也就是面向切面編程,它是面向?qū)ο缶幊蹋ㄏ驅(qū)ο缶幊蹋∣OP)的補充和完善。)的補充和完善。在在OOP中通過封裝、繼承和多態(tài)性等概念建立起了多個對象之間的層次結(jié)中通過封裝、繼承和多態(tài)性等概念建立起了多個對象之間的層次結(jié)構(gòu),但當(dāng)需要為這些分散的對象加入一些公共行為

9、時,構(gòu),但當(dāng)需要為這些分散的對象加入一些公共行為時,OOP就顯得力不從就顯得力不從心了。換句話說就是,心了。換句話說就是,OOP擅長的是定義從上到下的關(guān)系,但是并不適合擅長的是定義從上到下的關(guān)系,但是并不適合定義從左到右的關(guān)系。定義從左到右的關(guān)系。AOP的出現(xiàn)恰好解決了的出現(xiàn)恰好解決了OOP技術(shù)的這種局限性。技術(shù)的這種局限性。AOP利用了一種稱為利用了一種稱為“橫橫切切”的技術(shù),將封裝好的對象剖開,找出其中對多個對象產(chǎn)生影響的公共行的技術(shù),將封裝好的對象剖開,找出其中對多個對象產(chǎn)生影響的公共行為,并將其封裝為一個可重用的模塊,這個模塊被命名為為,并將其封裝為一個可重用的模塊,這個模塊被命名為“

10、切面切面”(Aspect)。切面將那些與業(yè)務(wù)無關(guān),卻被業(yè)務(wù)模塊共同調(diào)用的邏輯提?。?。切面將那些與業(yè)務(wù)無關(guān),卻被業(yè)務(wù)模塊共同調(diào)用的邏輯提取并封裝起來,減少了系統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時提高并封裝起來,減少了系統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時提高了系統(tǒng)的可維護(hù)性。了系統(tǒng)的可維護(hù)性。1.1.1 Spring的基本概念的基本概念4日志在在Spring中,日志主要用來監(jiān)控代碼中變量的變化,跟蹤代中,日志主要用來監(jiān)控代碼中變量的變化,跟蹤代碼運行的軌跡,在開發(fā)環(huán)境中擔(dān)當(dāng)調(diào)試器,向控制臺或文件碼運行的軌跡,在開發(fā)環(huán)境中擔(dān)當(dāng)調(diào)試器,向控制臺或文件輸出信息。在輸出信息。在Spring框

11、架中,日志記錄是必不可少的,如果框架中,日志記錄是必不可少的,如果沒有對應(yīng)的依賴包,會產(chǎn)生錯誤。沒有對應(yīng)的依賴包,會產(chǎn)生錯誤。1.1.2 Spring框架模塊框架模塊Spring框架遵從模塊的架構(gòu)方式,由總共框架遵從模塊的架構(gòu)方式,由總共20多個模塊組成多個模塊組成,包括核心容器,包括核心容器數(shù)據(jù)訪問數(shù)據(jù)訪問/集成集成WebAOP等。這些等。這些模塊為我們提供了開發(fā)企業(yè)級應(yīng)用所需要的一切東西。在模塊為我們提供了開發(fā)企業(yè)級應(yīng)用所需要的一切東西。在開發(fā)過程中,這些模塊并不都是必須的,可以針對具體的開發(fā)過程中,這些模塊并不都是必須的,可以針對具體的應(yīng)用自由選擇所需要的模塊。還可以將應(yīng)用自由選擇所需要

12、的模塊。還可以將Spring與其他框架與其他框架或庫進(jìn)行集成,使得開發(fā)過程更有針對性更有效率?;驇爝M(jìn)行集成,使得開發(fā)過程更有針對性更有效率。1.2 Spring開發(fā)準(zhǔn)備開發(fā)準(zhǔn)備1.2.1 下載下載Spring開發(fā)包開發(fā)包 目前目前Spring框架的開發(fā)包的最新穩(wěn)定版是框架的開發(fā)包的最新穩(wěn)定版是3.1.1,本書就采用該版,本書就采用該版本來介紹本來介紹Spring框架。開發(fā)包框架。開發(fā)包“spring-framework-3.1.1.RELEASE.zip”可到可到Spring官方網(wǎng)站官方網(wǎng)站/上下載。上下載。1.2.2 下載下載commons

13、-logging包包登錄站點登錄站點/logging.cgi 可下載可下載commons-logging的壓縮包的壓縮包 “commons-logging-1.1.1-bin.zip”。1.2.3 Spring框架配置框架配置在下載完在下載完Spring框架開發(fā)所需要的開發(fā)包后,將其解壓縮。打開框架開發(fā)所需要的開發(fā)包后,將其解壓縮。打開Spring開發(fā)包解壓縮目錄,可以看到下圖所示目錄。開發(fā)包解壓縮目錄,可以看到下圖所示目錄。1.2.3 Spring框架配置框架配置將將commons-logging壓縮包解壓縮,打開其解壓縮目錄,可以看到壓縮包解

14、壓縮,打開其解壓縮目錄,可以看到下圖所示目錄。下圖所示目錄。 1.3 Spring開發(fā)實例開發(fā)實例1.3.1 開發(fā)實例開發(fā)實例【例例15-1】下面通過該實例來介紹下面通過該實例來介紹Spring框架程序的一般構(gòu)建方式。框架程序的一般構(gòu)建方式。1.3.2 Spring的的IoC容器容器Spring的的IoC容器是一個提供容器是一個提供IoC支持的輕量級容器,支持的輕量級容器,IoC容器為管理對象之容器為管理對象之間的依賴關(guān)系提供了基礎(chǔ)功能。間的依賴關(guān)系提供了基礎(chǔ)功能。Spring為我們提供了兩種容器:為我們提供了兩種容器:BeanFactory和和ApplicationContext。BeanF

15、actory由由org.springframework.beans.factory.BeanFactory接口定接口定義,是基礎(chǔ)類型的義,是基礎(chǔ)類型的IoC容器,并能提供完整的容器,并能提供完整的IoC服務(wù)支持。服務(wù)支持。IoC容器需要為容器需要為其具體的實現(xiàn)提供基本的功能規(guī)范,而其具體的實現(xiàn)提供基本的功能規(guī)范,而BeanFactory接口則提供了該功能規(guī)接口則提供了該功能規(guī)范的設(shè)計,每個具體的范的設(shè)計,每個具體的Spring IoC容器都要滿足容器都要滿足BeanFactory接口的定義。接口的定義。ApplicationContext由由org.springframework.contex

16、t.ApplicationContext接口定義,是以接口定義,是以BeanFactory為基礎(chǔ)構(gòu)建的。為基礎(chǔ)構(gòu)建的。此外,此外,Spring還提供了還提供了BeanFactory和和ApplicationContext的幾種實現(xiàn)類,的幾種實現(xiàn)類,它們也都稱為它們也都稱為Spring的容器。的容器。1.3.2 Spring的的IoC容器容器1BeanFactory及其工作原理BeanFactory在在Spring中的作用至關(guān)重要,它實際上是一個用于配中的作用至關(guān)重要,它實際上是一個用于配置和管理置和管理Java類的內(nèi)部接口,負(fù)責(zé)初始化各種類的內(nèi)部接口,負(fù)責(zé)初始化各種Bean并調(diào)用它們的并調(diào)用它

17、們的生命周期方法。生命周期方法。Spring中提供了幾種中提供了幾種BeanFactory的實現(xiàn)方法,最常使用的是的實現(xiàn)方法,最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory,它,它會根據(jù)會根據(jù)XML配置文件中的定義來裝配配置文件中的定義來裝配Bean。創(chuàng)建創(chuàng)建BeanFactory實例時,需要提供實例時,需要提供Spring容器所管理的容器所管理的Bean的的詳細(xì)配置信息。詳細(xì)配置信息。Spring的配置信息通常采用的配置信息通常采用XML文件的形式來管理,文件的形式來管理,所以,在創(chuàng)建所以,在創(chuàng)建BeanFactory實例

18、時,需要依據(jù)實例時,需要依據(jù)XML配置文件中提供配置文件中提供的信息。的信息。1.3.2 Spring的的IoC容器容器2BeanFactory接口包含如下的基本方法 Boolean containsBean(String name):判斷:判斷Spring容器是否包容器是否包含含id為為name的的bean定義。定義。 Object getBean(String name):返回容器中:返回容器中id為為name的的bean。 Object getBean(String name, Class requiredType):返回容器:返回容器中中id為為name,并且類型為并且類型為requi

19、redType的的bean。 Class getType(String name):返回容器中:返回容器中id為為name的的bean的的類型。類型。 小結(jié)小結(jié)本章主要介紹了本章主要介紹了Spring框架的基本知識,包括控制反轉(zhuǎn)和依框架的基本知識,包括控制反轉(zhuǎn)和依賴注入,賴注入,Spring框架的核心模塊,以及框架的核心模塊,以及Spring框架的配置等內(nèi)框架的配置等內(nèi)容,并通過容,并通過SpringDemo實例使讀者對使用實例使讀者對使用Spring框架進(jìn)行編框架進(jìn)行編程有了一個初步的了解。程有了一個初步的了解。2. Spring之IoC原理與具體使用在實例項目中使用SpringSpring

20、 IoC原理簡介Spring IoC簡單模擬實現(xiàn)2.1 在實例項目中使用在實例項目中使用Spring 【例例16-1】在這個例子中,在這個例子中, 創(chuàng)建一個創(chuàng)建一個HelloWorld類,用類,用Spring來來實現(xiàn)在控制臺上打印出實現(xiàn)在控制臺上打印出“Hello World!”語句的功能。語句的功能。2.2 深入理解依賴注入深入理解依賴注入2.2.1 依賴注入依賴注入依賴注入(依賴注入(Dependency Injection, DI)也被稱為控制反轉(zhuǎn))也被稱為控制反轉(zhuǎn)(Inversion of Control,IoC)。早在)。早在2004年,年,Martin Fowler就就在論文在論文

21、Inversion of Control Containers and the Dependency Injection pattern中提出問題:中提出問題:“哪些方面的控制被反轉(zhuǎn)了?哪些方面的控制被反轉(zhuǎn)了?”。根據(jù)他的觀點根據(jù)他的觀點是依賴對象的獲得被反轉(zhuǎn)了。于是他為控制反轉(zhuǎn)是依賴對象的獲得被反轉(zhuǎn)了。于是他為控制反轉(zhuǎn)創(chuàng)造了一個更好的名字:依賴注入。創(chuàng)造了一個更好的名字:依賴注入。由此我們知道,依賴注入和控制反轉(zhuǎn)的含義完全相同,只是從兩個由此我們知道,依賴注入和控制反轉(zhuǎn)的含義完全相同,只是從兩個角度來描述了同一個概念。對于一個角度來描述了同一個概念。對于一個Spring初學(xué)者來說,這兩種說初

22、學(xué)者來說,這兩種說法同樣生澀難懂,因此,我們嘗試用更加簡單通用的語言和例子來法同樣生澀難懂,因此,我們嘗試用更加簡單通用的語言和例子來描述出這個概念。描述出這個概念。2.2.1 依賴注入依賴注入當(dāng)某個當(dāng)某個Java實例(調(diào)用者)需要另一個實例(調(diào)用者)需要另一個Java實例(被調(diào)用者)時,實例(被調(diào)用者)時,調(diào)用者自身需要負(fù)責(zé)實現(xiàn)這個獲取過程調(diào)用者自身需要負(fù)責(zé)實現(xiàn)這個獲取過程由程序內(nèi)部代碼來控制由程序內(nèi)部代碼來控制對象之間的關(guān)系。我們已經(jīng)熟悉的方式是調(diào)用者采用對象之間的關(guān)系。我們已經(jīng)熟悉的方式是調(diào)用者采用“new 構(gòu)造方構(gòu)造方法法”的形式來創(chuàng)建被調(diào)用者以實現(xiàn)兩個或多個對象的組合,但是這的形式來

23、創(chuàng)建被調(diào)用者以實現(xiàn)兩個或多個對象的組合,但是這種實現(xiàn)方式不僅會導(dǎo)致代碼的耦合度高而且難于測試。一個好的設(shè)種實現(xiàn)方式不僅會導(dǎo)致代碼的耦合度高而且難于測試。一個好的設(shè)計,不但要求代碼盡可能多的實現(xiàn)復(fù)用,還要求組件之間盡量解耦。計,不但要求代碼盡可能多的實現(xiàn)復(fù)用,還要求組件之間盡量解耦。而依賴注入的出現(xiàn)完美的解決了代碼的高耦合度問題。而依賴注入的出現(xiàn)完美的解決了代碼的高耦合度問題。2.2.1 依賴注入依賴注入 用一句話概括依賴注入就是用一句話概括依賴注入就是“不要來找我,我會去找你不要來找我,我會去找你”,也就,也就是說,一個類不需要去查找或?qū)嵗鼈兯蕾嚨念?。對象間的是說,一個類不需要去查找或?qū)?/p>

24、例化它們所依賴的類。對象間的依賴關(guān)系是在對象創(chuàng)建時由負(fù)責(zé)協(xié)調(diào)項目中各個對象的外部容器依賴關(guān)系是在對象創(chuàng)建時由負(fù)責(zé)協(xié)調(diào)項目中各個對象的外部容器來提供并管理的。也就是強(qiáng)調(diào)了對象間的某種依賴關(guān)系是由容器來提供并管理的。也就是強(qiáng)調(diào)了對象間的某種依賴關(guān)系是由容器在運行期間注入調(diào)用者的,控制程序間關(guān)系的實現(xiàn)交給了外部的在運行期間注入調(diào)用者的,控制程序間關(guān)系的實現(xiàn)交給了外部的容器來完成。這樣,當(dāng)調(diào)用者需要被調(diào)用者對象時,調(diào)用者不需容器來完成。這樣,當(dāng)調(diào)用者需要被調(diào)用者對象時,調(diào)用者不需要知道具體實現(xiàn)細(xì)節(jié),它只需要從容器中拿出一個對象并使用就要知道具體實現(xiàn)細(xì)節(jié),它只需要從容器中拿出一個對象并使用就可以了??梢?/p>

25、了。2.2.1 依賴注入依賴注入圖2.3 調(diào)用者構(gòu)造汽車對象圖2.4 將汽車對象注入調(diào)用者對象2.2.2 依賴注入的依賴注入的3種實現(xiàn)方式種實現(xiàn)方式依賴注入存在著三種實現(xiàn)方式,分別是設(shè)值注入、構(gòu)造方法依賴注入存在著三種實現(xiàn)方式,分別是設(shè)值注入、構(gòu)造方法注入和接口注入。注入和接口注入。1設(shè)值注入設(shè)值注入是指設(shè)值注入是指IoC容器使用容器使用setter方法來注入被依賴的實例。通過調(diào)方法來注入被依賴的實例。通過調(diào)用無參構(gòu)造器或無參用無參構(gòu)造器或無參static工廠方法實例化工廠方法實例化bean之后,調(diào)用該之后,調(diào)用該bean的的setter方法,即可實現(xiàn)基于方法,即可實現(xiàn)基于setter的的DI

26、。2.2.2 依賴注入的依賴注入的3種實現(xiàn)方式種實現(xiàn)方式2構(gòu)造方法注入構(gòu)造方法注入是指構(gòu)造方法注入是指IoC容器使用構(gòu)造方法來注入被依賴的實例?;萜魇褂脴?gòu)造方法來注入被依賴的實例?;跇?gòu)造器的于構(gòu)造器的DI通過調(diào)用帶參數(shù)的構(gòu)造器來實現(xiàn),每個參數(shù)代表著一通過調(diào)用帶參數(shù)的構(gòu)造器來實現(xiàn),每個參數(shù)代表著一個依賴。個依賴。 2.2.2 依賴注入的依賴注入的3種實現(xiàn)方式種實現(xiàn)方式3接口注入接口注入需要類實現(xiàn)特定的接口或繼承特定的類。但是這樣一來,接口注入需要類實現(xiàn)特定的接口或繼承特定的類。但是這樣一來,類就必須依賴于這些特定的接口或特定的類,這也就意味著侵入性。類就必須依賴于這些特定的接口或特定的類,這

27、也就意味著侵入性。因此這種注入方式基本上已經(jīng)被遺棄了。因此這種注入方式基本上已經(jīng)被遺棄了。2.3 Spring IoC簡單模擬實現(xiàn)簡單模擬實現(xiàn)【例例16-5】模擬實現(xiàn)模擬實現(xiàn)Spring IoC容器。容器。使用了使用了java反射機(jī)制和反射機(jī)制和jdom操縱操縱XML文檔的知識。文檔的知識。 小結(jié)小結(jié)本章先介紹了一個項目實例,然后通過汽車的例子形象的解釋了本章先介紹了一個項目實例,然后通過汽車的例子形象的解釋了Spring中依賴注入中依賴注入ID和控制反轉(zhuǎn)和控制反轉(zhuǎn)IoC的思想,使讀者明確它們實際的思想,使讀者明確它們實際上是同一概念兩種不同表達(dá),進(jìn)而揭示了依賴注入的本質(zhì)和內(nèi)涵。上是同一概念兩

28、種不同表達(dá),進(jìn)而揭示了依賴注入的本質(zhì)和內(nèi)涵。接著,討論了實現(xiàn)依賴注入的三種方式,包括設(shè)值方法注入、構(gòu)造接著,討論了實現(xiàn)依賴注入的三種方式,包括設(shè)值方法注入、構(gòu)造方法注入和接口注入,其中接口注入的方式現(xiàn)在已不再使用。方法注入和接口注入,其中接口注入的方式現(xiàn)在已不再使用。最后,在深入理解了依賴注入和控制反轉(zhuǎn)思想的基礎(chǔ)上,通過編程最后,在深入理解了依賴注入和控制反轉(zhuǎn)思想的基礎(chǔ)上,通過編程模擬實現(xiàn)了模擬實現(xiàn)了Spring IoC容器的基本功能。容器的基本功能。3. Spring之進(jìn)階運用配置Bean的屬性和依賴關(guān)系管理Bean的生命周期讓Bean可以被Spring感知Spring的國際化3.1 配置配

29、置Bean的屬性和依賴關(guān)系的屬性和依賴關(guān)系3.1.1 Bean的配置的配置 要完成要完成Bean的配置,就需要告訴容器到底需要哪些的配置,就需要告訴容器到底需要哪些Bean以及容以及容器使用何種方式將它們裝配在一起。器使用何種方式將它們裝配在一起。 Spring的的IoC容器支持兩種格式的配置文件:容器支持兩種格式的配置文件:Properties文件格式文件格式和和XML文件格式。文件格式。XML配置文件通過配置文件通過XML文件來注冊并管理文件來注冊并管理Bean之間的依賴關(guān)系,它是最常用、功能最完整的配置文件表達(dá)之間的依賴關(guān)系,它是最常用、功能最完整的配置文件表達(dá)方式。方式。3.1.1 B

30、ean的配置的配置1定義BeanSpring的的IoC容器管理一個或多個容器管理一個或多個Bean,這些,這些Bean由容器根據(jù)由容器根據(jù)XML文件中提供的文件中提供的Bean配置信息進(jìn)行創(chuàng)建。配置信息進(jìn)行創(chuàng)建。XML配置文件的根元素是配置文件的根元素是,包含了多個包含了多個子元素,每個子元素,每個子元素定義了一個子元素定義了一個Bean,并描述了該,并描述了該Bean如如何被裝配到何被裝配到Spring容器中。容器中。3.1.1 Bean的配置的配置一個一個Bean通常包括通常包括id和和class兩個屬性。兩個屬性。id屬性:是一個屬性:是一個Bean的唯一標(biāo)識符,容器對的唯一標(biāo)識符,容器

31、對Bean的配置、管理都的配置、管理都通過該屬性來完成。通過該屬性來完成。Bean的的id屬性在屬性在Spring容器中應(yīng)是唯一的,如果想給容器中應(yīng)是唯一的,如果想給Bean添加別添加別名或想使用一些不合法的名或想使用一些不合法的XML字符,如字符,如“/”,則可以通過指定,則可以通過指定Bean的的name屬性進(jìn)行設(shè)定。屬性進(jìn)行設(shè)定。name屬性:可以在屬性:可以在name屬性中為屬性中為Bean指定多個名稱(別名),指定多個名稱(別名),每個名稱之間使用逗號或分號隔開。每個名稱之間使用逗號或分號隔開。class屬性:該屬性指定了屬性:該屬性指定了Bean的具體實現(xiàn)類,它必須是一個完整的具體

32、實現(xiàn)類,它必須是一個完整的類名,使用類的全限定名的類名,使用類的全限定名3.1.1 Bean的配置的配置下面的代碼定義了兩個下面的代碼定義了兩個Bean:3.1.2 設(shè)置普通屬性值設(shè)置普通屬性值的的value屬性用于指定字符串類型或者基本類型的屬性用于指定字符串類型或者基本類型的屬性值,屬性值,Spring利用利用JavaBeans PropertyEditors將解析出將解析出來的來的string類型轉(zhuǎn)換成需要的參數(shù)值類型。默認(rèn)情況下,類型轉(zhuǎn)換成需要的參數(shù)值類型。默認(rèn)情況下,value屬性或者屬性或者標(biāo)簽不僅能讀取標(biāo)簽不僅能讀取Java.lang.String類型,類型,還能將其轉(zhuǎn)換成其他任

33、何基本類型或者對應(yīng)包裝類。還能將其轉(zhuǎn)換成其他任何基本類型或者對應(yīng)包裝類。3.1.3 配置合作者配置合作者Bean 如果需要為如果需要為Bean設(shè)置的屬性值是容器中的另一個設(shè)置的屬性值是容器中的另一個Bean實例,則可以實例,則可以在在Spring的配置文件中使用的配置文件中使用property元素的子元素元素的子元素ref將一個將一個Bean注注入到另一個入到另一個Bean中。也可以使用中。也可以使用property元素的元素的ref屬性來完成注入,屬性來完成注入,兩種方式的效果相同,只是使用兩種方式的效果相同,只是使用ref屬性的方式更為簡潔。屬性的方式更為簡潔。 配置合作者配置合作者Bea

34、n時首先必須配置兩個時首先必須配置兩個bean:一個被注入的和一個注:一個被注入的和一個注入的目標(biāo),然后,就可以簡單地在目標(biāo)上使用入的目標(biāo),然后,就可以簡單地在目標(biāo)上使用ref屬性配置注入了。屬性配置注入了。3.1.3 配置合作者配置合作者Bean 3.1.4 注入集合值注入集合值很多情況下,我們需要在很多情況下,我們需要在Bean中配置一組對象的集合而不僅僅是單中配置一組對象的集合而不僅僅是單獨的幾個獨的幾個Bean或者基本類型值,針對這種情況,或者基本類型值,針對這種情況,Spring提供了直提供了直接向接向Bean注入一個對象的集合的方法。注入一個對象的集合的方法。在在Spring中,注

35、入集合值并不復(fù)雜:可以使用中,注入集合值并不復(fù)雜:可以使用或或元素來分別表示元素來分別表示List、Map、Set或者或者Properties對象,對象,然后向其中傳入任何可用于注入的其他類型的獨立元素即可,就像然后向其中傳入任何可用于注入的其他類型的獨立元素即可,就像給普通的給普通的標(biāo)簽配置屬性一樣。標(biāo)簽配置屬性一樣。3.2 管理管理Bean的生命周期的生命周期 Spring可以管理可以管理singleton作用域作用域Bean的生命周期,的生命周期,Spring可以可以精確地知道該精確地知道該Bean何時被創(chuàng)建,何時初始化完成,以及何時被銷何時被創(chuàng)建,何時初始化完成,以及何時被銷毀。對于毀

36、。對于prototype作用域的作用域的Bean,Spring僅僅負(fù)責(zé)創(chuàng)建,當(dāng)容僅僅負(fù)責(zé)創(chuàng)建,當(dāng)容器創(chuàng)建了器創(chuàng)建了Bean實例后,實例后,Bean實例完全交給客戶端代碼管理,容實例完全交給客戶端代碼管理,容器不再跟蹤其生命周期。每次客戶端請求器不再跟蹤其生命周期。每次客戶端請求prototype作用域的作用域的Bean時,時,Spring會創(chuàng)建一個新的實例,會創(chuàng)建一個新的實例,Spring容器并不管那些容器并不管那些被配置成被配置成prototype作用域的作用域的Bean的生命周期。的生命周期。3.2 管理管理Bean的生命周期的生命周期管理管理Bean的生命周期重點在于在某個的生命周期重點

37、在于在某個Bean生命周期的某些指生命周期的某些指定時刻接受通知。這樣能夠允許你的定時刻接受通知。這樣能夠允許你的Bean在其存活期間的指在其存活期間的指定時刻完成一些相關(guān)操作。這樣的時刻可能有許多,但一般而定時刻完成一些相關(guān)操作。這樣的時刻可能有許多,但一般而言,有兩個生命周期時刻與言,有兩個生命周期時刻與Bean關(guān)系顯得尤為重要:關(guān)系顯得尤為重要:postinitiation(初始化后)和(初始化后)和predestruction(銷毀前)。(銷毀前)。3.2 管理管理Bean的生命周期的生命周期Spring中,中,Bean的生命周期更加復(fù)雜,可以利用的生命周期更加復(fù)雜,可以利用Sprin

38、g提供的方提供的方法來定制法來定制Bean的創(chuàng)建過程。的創(chuàng)建過程。當(dāng)一個當(dāng)一個Bean被加載到被加載到Spring容器中時,它就具有了生命。而容器中時,它就具有了生命。而Spring在保證一個在保證一個Bean能夠使用之前會預(yù)先做很多工作。能夠使用之前會預(yù)先做很多工作。 3.2.1 Spring容器中容器中Bean的作用域的作用域在在Spring容器初始化一個容器初始化一個Bean實例時,可以同時為其指定特定的實例時,可以同時為其指定特定的作用域。作用域。在在Spring 2.0之前,之前,Bean只有兩種作用域,分別是只有兩種作用域,分別是singleton(單例單例)和和prototype

39、(原型),(原型),Spring 2.0以后的版本中,又增加了以后的版本中,又增加了session、request、global session三種專用于三種專用于Web應(yīng)用程序上下應(yīng)用程序上下文的文的Bean。在在Spring 3.0中,仍然支持上述中,仍然支持上述5種種Bean作用域,同時,用戶還可作用域,同時,用戶還可以根據(jù)自己的需要,增加新的以根據(jù)自己的需要,增加新的Bean類型,以滿足實際應(yīng)用的需求。類型,以滿足實際應(yīng)用的需求。3.2.1 Spring容器中容器中Bean的作用域的作用域Spring 3.0中支持的中支持的5種作用域如下種作用域如下:Singleton:單例模式,使用

40、:單例模式,使用singleton定義的定義的Bean在在Spring容器容器中將只有一個實例,也就是說:無論多少個中將只有一個實例,也就是說:無論多少個Bean引用到它,始終指引用到它,始終指向的是同一個對象。向的是同一個對象。Prototype:原型模式:每次通過:原型模式:每次通過Spring容器獲取容器獲取prototype定義的定義的Bean時,容器都將創(chuàng)建一個新的時,容器都將創(chuàng)建一個新的Bean實例。實例。Request:針對每一次:針對每一次HTTP請求都會產(chǎn)生一個新的請求都會產(chǎn)生一個新的Bean,而且該,而且該Bean僅在當(dāng)前僅在當(dāng)前HTTP request內(nèi)有效。內(nèi)有效。Se

41、ssion:針對每一次:針對每一次HTTP請求都會產(chǎn)生一個新的請求都會產(chǎn)生一個新的Bean,而且該,而且該Bean僅在當(dāng)前僅在當(dāng)前HTTP session內(nèi)有效。內(nèi)有效。Global session:類似于標(biāo)準(zhǔn)的:類似于標(biāo)準(zhǔn)的HTTP Session作用域,但是它僅作用域,但是它僅僅在基于僅在基于portlet的的web應(yīng)用中有效。應(yīng)用中有效。3.2.1 Spring容器中容器中Bean的作用域的作用域?qū)τ趯τ趕ingleton作用域的作用域的Bean,由容器來管理,由容器來管理Bean的生命周期,容的生命周期,容器可以精確地掌握該器可以精確地掌握該Bean何時被創(chuàng)建,何時初始化完成以及何時被

42、何時被創(chuàng)建,何時初始化完成以及何時被銷毀。當(dāng)一個銷毀。當(dāng)一個Bean的作用域被設(shè)置為的作用域被設(shè)置為singleton時,那么在時,那么在Spring容器中就只存在一個共享的容器中就只存在一個共享的Bean實例,每次請求該實例,每次請求該Bean時,只要時,只要id與與Bean定義相匹配,則都將獲得同一個實例。換句話說,容器只定義相匹配,則都將獲得同一個實例。換句話說,容器只為為singleton作用域的作用域的Bean創(chuàng)建一個唯一實例。創(chuàng)建一個唯一實例。對于對于prototype作用域的作用域的Bean,每次請求一個,每次請求一個Bean實例時容器都會實例時容器都會返回一個新的、不同的實例,

43、此時,容器僅僅負(fù)責(zé)創(chuàng)建返回一個新的、不同的實例,此時,容器僅僅負(fù)責(zé)創(chuàng)建Bean實例,實例,且實例創(chuàng)建完成后,就將其完全交給客戶端代碼管理,容器不再跟且實例創(chuàng)建完成后,就將其完全交給客戶端代碼管理,容器不再跟蹤其生命周期。蹤其生命周期。3.2.2 Bean的實例化的實例化當(dāng)一個當(dāng)一個Bean實例化時,往往需要執(zhí)行一些初始化工作,然后才能使實例化時,往往需要執(zhí)行一些初始化工作,然后才能使用該用該Bean實例。反之,當(dāng)不再需要某個實例。反之,當(dāng)不再需要某個Bean實例時,則需要從容實例時,則需要從容器中刪除它,此時也要按順序做一些清理工作。器中刪除它,此時也要按順序做一些清理工作。Spring提供兩

44、種方法在提供兩種方法在Bean全部屬性設(shè)置成功后執(zhí)行指定行為:全部屬性設(shè)置成功后執(zhí)行指定行為:(1)使用)使用init-method屬性;屬性;(2)實現(xiàn))實現(xiàn)initializingBean接口。接口。3.2.2 Bean的實例化的實例化1指定初始化方法使用使用init-method屬性指定某個初始化方法需要在屬性指定某個初始化方法需要在Bean全部依賴全部依賴關(guān)系設(shè)置完成后執(zhí)行。這種回調(diào)機(jī)制在僅定義多個同類型關(guān)系設(shè)置完成后執(zhí)行。這種回調(diào)機(jī)制在僅定義多個同類型Bean或或者希望自己的應(yīng)用程序和者希望自己的應(yīng)用程序和Spring解耦合時會十分有效。使用這種解耦合時會十分有效。使用這種機(jī)制的另一

45、個好處是:它能夠讓我們的機(jī)制的另一個好處是:它能夠讓我們的Spring應(yīng)用程序同之前創(chuàng)應(yīng)用程序同之前創(chuàng)建的或者由第三方提供的建的或者由第三方提供的Bean無縫完美地協(xié)同工作。無縫完美地協(xié)同工作。 3.2.2 Bean的實例化的實例化2實現(xiàn)InitializingBean接口Spring中的中的org.springframework.beans.factory.InitializingBean接口提供了定義初始化方法的一種方式。它允許容器在設(shè)置好接口提供了定義初始化方法的一種方式。它允許容器在設(shè)置好Bean的所有必需屬性后給的所有必需屬性后給Bean發(fā)通知,以執(zhí)行初始化工作。一旦某個發(fā)通知,以執(zhí)

46、行初始化工作。一旦某個Bean實現(xiàn)了實現(xiàn)了InitializingBean接口,那么這個接口,那么這個Bean的代碼就與的代碼就與Spring耦合到一起了。耦合到一起了。InitializingBean接口只定義了一個接口只定義了一個afterPropertiesSet方法,可以方法,可以在該方法內(nèi)部對在該方法內(nèi)部對Bean做一些初始化處理工作,如檢查做一些初始化處理工作,如檢查Bean配置以配置以確保其有效等。凡是繼承了確保其有效等。凡是繼承了InitializingBean接口的類,在初始化接口的類,在初始化Bean的時候都會執(zhí)行其的時候都會執(zhí)行其afterPropertiesSet方法。

47、方法。3.2.3 Bean的銷毀的銷毀與初始化類似,與初始化類似,Spring也提供了兩種方法在也提供了兩種方法在Bean實例實例銷毀之前執(zhí)行指定的動作。銷毀之前執(zhí)行指定的動作。 使用使用destroy-method屬性;屬性; 實現(xiàn)實現(xiàn)DisposableBean接口。接口。3.2.4 使用方法注入使用方法注入?yún)f(xié)調(diào)作用域協(xié)調(diào)作用域不同的不同的Bean Spring從從1.1版本時就引入了一個控制反轉(zhuǎn)的新特性版本時就引入了一個控制反轉(zhuǎn)的新特性方法注方法注入(入(method injection),它為協(xié)作者之間的交互提供了更大的),它為協(xié)作者之間的交互提供了更大的靈活性。方法注入一般使用的是靈

48、活性。方法注入一般使用的是loopup方法(查找方法)注入。方法(查找方法)注入。 當(dāng)一個當(dāng)一個Bean依賴另一個不同生命周期的依賴另一個不同生命周期的Bean時,設(shè)值注入或者時,設(shè)值注入或者構(gòu)造方法注入會導(dǎo)致構(gòu)造方法注入會導(dǎo)致singleton Bean去維護(hù)去維護(hù)non-singleton Bean的單個實例,但是的單個實例,但是lookup方法注入允許方法注入允許singleton Bean聲聲明一個它需要的明一個它需要的non-singleton依賴并在每次需要和其交互時返依賴并在每次需要和其交互時返回一個回一個non-singleton Bean的實例,同時無需實現(xiàn)任何的實例,同時無

49、需實現(xiàn)任何Spring專有接口。專有接口。 lookup方法注入利用了方法注入利用了Spring容器重寫容器重寫B(tài)ean中的抽象方法或具中的抽象方法或具體方法的能力體方法的能力,從而返回指定名字的從而返回指定名字的Bean實例,常用來獲取一個實例,常用來獲取一個non-singleton對象。對象。 3.3 讓讓Bean可以感知可以感知Spring容器容器3.3.1 使用使用BeanNameAware接口接口一個一個Bean能通過實現(xiàn)能通過實現(xiàn)BeanNameAware接口來獲取自己接口來獲取自己的名字,此接口只有一個方法:的名字,此接口只有一個方法:setBeanName(String na

50、me),該方法的,該方法的name參數(shù)是參數(shù)是Bean的的id,實現(xiàn)了該方法的,實現(xiàn)了該方法的Bean類可以通過該方法來獲得部署該類可以通過該方法來獲得部署該Bean時所指定的時所指定的id。在。在Bean的屬性設(shè)置完以后,在初始化回調(diào)方法執(zhí)行之前,的屬性設(shè)置完以后,在初始化回調(diào)方法執(zhí)行之前,setBeanName回調(diào)方法會先被調(diào)用?;卣{(diào)方法會先被調(diào)用。3.3 讓讓Bean可以感知可以感知Spring容器容器3.3.2 使用使用BeanFactoryAware接口、接口、ApplicationContextAware接口接口設(shè)計設(shè)計BeanFactoryAware接口的主要目的是為了讓接口的主

51、要目的是為了讓Bean能能夠以編程的方式使用夠以編程的方式使用getBean( )訪問其他的訪問其他的Bean。然而,實際中。然而,實際中應(yīng)該避免這樣的行為,這只會給應(yīng)該避免這樣的行為,這只會給Bean增加不必要的復(fù)雜度,并使增加不必要的復(fù)雜度,并使得代碼與得代碼與Spring耦合到一起。因此,更好的方式是使用依賴注入耦合到一起。因此,更好的方式是使用依賴注入為為Bean來提供協(xié)作對象。來提供協(xié)作對象。與與BeanFactoryAware類似,類似,ApplicationContextAware接接口能夠取得口能夠取得ApplicationContext容器的引用。容器的引用。3.4 Spri

52、ng的國際化支持的國際化支持Spring中提供了對國際化的支持。通過使用中提供了對國際化的支持。通過使用MessageSource接接口,應(yīng)用程序可以訪問口,應(yīng)用程序可以訪問Spring資源、調(diào)用消息并保存為不同語言種類。資源、調(diào)用消息并保存為不同語言種類。對于每一種想要支持的語言,需要維護(hù)一個跟其他語言中消息一致的對于每一種想要支持的語言,需要維護(hù)一個跟其他語言中消息一致的消息列表。消息列表。小結(jié)小結(jié)介紹了介紹了Spring容器中的容器中的Bean,然后介紹了,然后介紹了Bean依賴的配置,依賴的配置,并詳細(xì)介紹了并詳細(xì)介紹了Bean的作用域、生命周期以及怎樣使一個的作用域、生命周期以及怎樣

53、使一個Bean感知到感知到所在的環(huán)境。最后介紹了所在的環(huán)境。最后介紹了Spring的國際化支持。的國際化支持。4. Spring MVC框架及標(biāo)簽庫解析Spring MVC技術(shù)解析Spring基礎(chǔ)標(biāo)簽庫解析Spring表單標(biāo)簽庫Spring MVC綜合實例4.1 解析解析Spring MVC技術(shù)技術(shù)4.1.1 MVC設(shè)計思想概述1MVC設(shè)計思想MVC指的是指的是Model-View-Controller,即把一個應(yīng)用的輸入、處理和輸出流程,即把一個應(yīng)用的輸入、處理和輸出流程按照按照Model、View和和Controller的方式進(jìn)行分離,這樣一個應(yīng)用就被分成三的方式進(jìn)行分離,這樣一個應(yīng)用就被

54、分成三層層模型層、視圖層和控制層。模型層、視圖層和控制層。一個一個Web應(yīng)用可以有很多不同的視圖(應(yīng)用可以有很多不同的視圖(View)。視圖代表了用戶的交互界面,)。視圖代表了用戶的交互界面,對于對于Web應(yīng)用來說,可以是應(yīng)用來說,可以是HTML,也可以是,也可以是JSP、XML等。在等。在MVC模式中,模式中,對于視圖的處理僅包含視圖上數(shù)據(jù)的采集和處理,而不包括對視圖上業(yè)務(wù)流程對于視圖的處理僅包含視圖上數(shù)據(jù)的采集和處理,而不包括對視圖上業(yè)務(wù)流程的處理。對業(yè)務(wù)流程的處理統(tǒng)一交由模型(的處理。對業(yè)務(wù)流程的處理統(tǒng)一交由模型(Model)負(fù)責(zé)。)負(fù)責(zé)。模型(模型(Model)負(fù)責(zé)業(yè)務(wù)的處理以及業(yè)務(wù)規(guī)

55、則的制定。模型接受視圖請求的數(shù))負(fù)責(zé)業(yè)務(wù)的處理以及業(yè)務(wù)規(guī)則的制定。模型接受視圖請求的數(shù)據(jù),并將最終處理結(jié)果返回。業(yè)務(wù)模型的設(shè)計是據(jù),并將最終處理結(jié)果返回。業(yè)務(wù)模型的設(shè)計是MVC思想最主要的核心。思想最主要的核心??刂疲刂疲–ontroller)用于從用戶接收請求,將模型和視圖相匹配,以共同完成)用于從用戶接收請求,將模型和視圖相匹配,以共同完成用戶的請求。用戶的請求。4.1.1 MVC設(shè)計思想概述設(shè)計思想概述2Model 1和Model 2架構(gòu)Model 1的基礎(chǔ)是的基礎(chǔ)是JSP文件,在文件,在Model 1模式下,一個模式下,一個Web應(yīng)用幾乎應(yīng)用幾乎全部由全部由JSP頁面構(gòu)成。這些頁面構(gòu)

56、成。這些JSP從從HTTP Request中獲取所需的數(shù)中獲取所需的數(shù)據(jù),進(jìn)行業(yè)務(wù)處理,然后通過據(jù),進(jìn)行業(yè)務(wù)處理,然后通過Response將結(jié)果返回給前端的瀏覽將結(jié)果返回給前端的瀏覽器。器。Model 1的實現(xiàn)比較簡單,可以加快系統(tǒng)的開發(fā)進(jìn)度。但是它將表的實現(xiàn)比較簡單,可以加快系統(tǒng)的開發(fā)進(jìn)度。但是它將表現(xiàn)層和業(yè)務(wù)邏輯混在在一起,使得現(xiàn)層和業(yè)務(wù)邏輯混在在一起,使得JSP頁面同時充當(dāng)了頁面同時充當(dāng)了View和和Controller兩種角色,不利于系統(tǒng)的維護(hù)和代碼的重用,因此,兩種角色,不利于系統(tǒng)的維護(hù)和代碼的重用,因此,Model 1模式只適合小型系統(tǒng)的開發(fā)。模式只適合小型系統(tǒng)的開發(fā)。4.1.1

57、MVC設(shè)計思想概述設(shè)計思想概述Model 2在在Model 1模式的基礎(chǔ)上又引入了模式的基礎(chǔ)上又引入了Servlet,它遵循了,它遵循了MVC的設(shè)計理念。在的設(shè)計理念。在Model 2模式中,模式中,Servlet充當(dāng)前端控制器,接受客充當(dāng)前端控制器,接受客戶端發(fā)送的各種業(yè)務(wù)請求。戶端發(fā)送的各種業(yè)務(wù)請求。 Model 2將模型層、視圖層和控制層區(qū)分開,每層分別負(fù)責(zé)不同的將模型層、視圖層和控制層區(qū)分開,每層分別負(fù)責(zé)不同的功能,改變了功能,改變了JSP頁面與業(yè)務(wù)邏輯緊密耦合的狀態(tài),提供了更好的頁面與業(yè)務(wù)邏輯緊密耦合的狀態(tài),提供了更好的代碼重用性和擴(kuò)展性。代碼重用性和擴(kuò)展性。4.1.2 Spring

58、 MVC的基本思想的基本思想Spring MVC是基于是基于Model 2實現(xiàn)的技術(shù)框架。在實現(xiàn)的技術(shù)框架。在Spring MVC中,中,Action不叫不叫Action,而被稱為,而被稱為Controller。Controller接受參數(shù)接受參數(shù)request和和response,并返回,并返回ModelAndView。Spring的的Web框架是圍繞分發(fā)器(框架是圍繞分發(fā)器(DispatcherServlet)設(shè)計的,)設(shè)計的,DispatcherServlet用來將請求分發(fā)到不同的處理器。用來將請求分發(fā)到不同的處理器。4.1.3 Spring MVC框架的特點框架的特點(1)Spring

59、 MVC框架的角色劃分非常清晰。框架的角色劃分非常清晰。(2)Spring MVC框架具有強(qiáng)大而直接的配置方式??蚣芫哂袕?qiáng)大而直接的配置方式。(3)Spring MVC框架具有良好的可適應(yīng)性。框架具有良好的可適應(yīng)性。(4)Spring MVC框架具有可重用的業(yè)務(wù)代碼??蚣芫哂锌芍赜玫臉I(yè)務(wù)代碼。(5)Spring MVC框架具有可定制的綁定(框架具有可定制的綁定(binding)和驗證)和驗證(validation)功能。)功能。(6)Spring MVC框架具有可定制的處理器映射(框架具有可定制的處理器映射(handler mapping)和視圖解析()和視圖解析(view resolutio

60、n)功能。)功能。(7)Spring MVC框架具有可定制的本地化和主題解析。框架具有可定制的本地化和主題解析。(8)Spring MVC框架具有簡單而強(qiáng)大的標(biāo)簽庫。框架具有簡單而強(qiáng)大的標(biāo)簽庫。4.1.4 分發(fā)器(分發(fā)器(DispatcherServlet)在在 S p r i n g 中 , 對中 , 對 W e b 框 架 的 設(shè) 計 是 圍 繞 分 發(fā) 器 (框 架 的 設(shè) 計 是 圍 繞 分 發(fā) 器 ( D i s spatcherServlet)來進(jìn)行的,)來進(jìn)行的,DispatcherServlet是一個能將請是一個能將請求分發(fā)到控制器的求分發(fā)到控制器的Servlet,這個,這個S

溫馨提示

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

評論

0/150

提交評論