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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18、時(shí),需要依據(jù)實(shí)例時(shí),需要依據(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,并且類(lèi)型為并且類(lèi)型為requi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

39、(原型),(原型),Spring 2.0以后的版本中,又增加了以后的版本中,又增加了session、request、global session三種專(zhuān)用于三種專(zhuān)用于Web應(yīng)用程序上下應(yīng)用程序上下文的文的Bean。在在Spring 3.0中,仍然支持上述中,仍然支持上述5種種Bean作用域,同時(shí),用戶還可作用域,同時(shí),用戶還可以根據(jù)自己的需要,增加新的以根據(jù)自己的需要,增加新的Bean類(lèi)型,以滿足實(shí)際應(yīng)用的需求。類(lèi)型,以滿足實(shí)際應(yīng)用的需求。3.2.1 Spring容器中容器中Bean的作用域的作用域Spring 3.0中支持的中支持的5種作用域如下種作用域如下:Singleton:?jiǎn)卫J剑褂?/p>

40、:?jiǎn)卫J剑褂胹ingleton定義的定義的Bean在在Spring容器容器中將只有一個(gè)實(shí)例,也就是說(shuō):無(wú)論多少個(gè)中將只有一個(gè)實(shí)例,也就是說(shuō):無(wú)論多少個(gè)Bean引用到它,始終指引用到它,始終指向的是同一個(gè)對(duì)象。向的是同一個(gè)對(duì)象。Prototype:原型模式:每次通過(guò):原型模式:每次通過(guò)Spring容器獲取容器獲取prototype定義的定義的Bean時(shí),容器都將創(chuàng)建一個(gè)新的時(shí),容器都將創(chuàng)建一個(gè)新的Bean實(shí)例。實(shí)例。Request:針對(duì)每一次:針對(duì)每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的Bean,而且該,而且該Bean僅在當(dāng)前僅在當(dāng)前HTTP request內(nèi)有效。內(nèi)有效。Se

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

59、 MVC框架的角色劃分非常清晰??蚣艿慕巧珓澐址浅G逦?。(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)和驗(yàn)證)和驗(yàn)證(validation)功能。)功能。(6)Spring MVC框架具有可定制的處理器映射(框架具有可定制的處理器映射(handler mapping)和視圖解析()和視圖解析(view resolutio

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論