Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介
? ? ? ? ?spring?是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為?J2EE?應(yīng)用程序開發(fā)提供集成的框架。??然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。?Spring的核心是個(gè)輕量級容器(Container),實(shí)現(xiàn)了IoC(Inversion?of?Control)模式的容器,Spring的目標(biāo)是實(shí)現(xiàn)一個(gè)全方位的整合框架,在Spring框架下實(shí)現(xiàn)多個(gè)子框架的組合,這些子框架之間彼此可以獨(dú)立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop?shop的框架整合方案?
??????簡單來說,Spring是一個(gè)輕量級的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架。
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對象不依賴于Spring的特定類。
控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對象依賴的其它對象會通過被動的方式傳遞進(jìn)來,而不是這個(gè)對象自己創(chuàng)建或者查找依賴對象。你可以認(rèn)為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時(shí)不等對象請求就主動將依賴傳遞給它。
面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識)其它的系統(tǒng)級關(guān)注點(diǎn),例如日志或事務(wù)支持。
容器——Spring包含并管理應(yīng)用對象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
框架——Spring可以將簡單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。 所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。?
Spring?框架是一個(gè)分層架構(gòu),由?7?個(gè)定義良好的模塊組成。Spring?模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理?bean?的方式,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
Spring?框架的分為7個(gè)模塊,組成?Spring?框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:?
1.核心容器:核心容器提供?Spring?框架的基本功能。核心容器的主要組件是?BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory?使用控制反轉(zhuǎn)?(IOC)?模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
2.Spring?上下文:Spring?上下文是一個(gè)配置文件,向?Spring?框架提上下文信息。Spring?上下文包括企業(yè)服務(wù),例如?JNDI、EJB、電子郵件、國際化、校驗(yàn)和調(diào)度功能。
3.Spring?AOP:通過配置管理特性,Spring?AOP?模塊直接將面向方面的編程功能集成到了?Spring?框架中。所以,可以很容易地使?Spring?框架管理的任何對象支持?AOP。Spring?AOP?模塊為基于?Spring?的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用?Spring?AOP,不用依賴?EJB?組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
?? ? ??4.?Spring?DAO:JDBC?DAO?抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring?DAO?的面向?JDBC?的異常遵從通用的?DAO?異常層次結(jié)構(gòu)。
? ? ??5.Spring?ORM:Spring?框架插入了若干個(gè)?ORM?框架,從而提供了?ORM?的對象關(guān)系工具,其中包括?JDO、hibernate?和?iBatis?SQL?Map。所有這些都遵從?Spring?的通用事務(wù)和?DAO?異常層次結(jié)構(gòu)。
6.?Spring?Web?模塊:Web?上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于?Web?的應(yīng)用程序提供了上下文。所以,Spring?框架支持與?Jakarta?Struts?的集成。Web?模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/span>
7.?Spring?MVC?框架:MVC?框架是一個(gè)全功能的構(gòu)建?Web?應(yīng)用程序的?MVC?實(shí)現(xiàn)。通過策略接口,MVC?框架變成為高度可配置的,MVC?容納了大量視圖技術(shù),其中包括?JSP、Velocity、Tiles、iText?和?POI。
?Spring?框架的功能可以用在任何?J2EE?服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring?的核心要點(diǎn)是:支持不綁定到特定?J2EE?服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問對象。毫無疑問,這樣的對象可以在不同?J2EE?環(huán)境?(Web?或?EJB)、獨(dú)立應(yīng)用程序、測試環(huán)境之間重用。??
????????
總結(jié)起來,Spring有如下優(yōu)點(diǎn):
1.低侵入式設(shè)計(jì),代碼污染極低
2.?獨(dú)立于各種應(yīng)用服務(wù)器,可以真正實(shí)現(xiàn)Write?Once,Run?Anywhere的承諾
3.Spring的DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性
4.Spring并不完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部?????
?????IOC?和?AOP:這兩個(gè)概念可以算是spring中的核心了,這兩個(gè)概念非常抽象,并且也不容易理解,所以我們下面來簡單來描述一下這兩個(gè)概念。
??控制反轉(zhuǎn)模式(也稱作依賴性介入)的基本概念是:不創(chuàng)建對象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。容器?(在?Spring?框架中是?IOC?容器)?負(fù)責(zé)將這些聯(lián)系在一起。在典型的?IOC?場景中,容器創(chuàng)建了所有對象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了?IOC?的一個(gè)實(shí)現(xiàn)模式。
| 類型?1 | 服務(wù)需要實(shí)現(xiàn)專門的接口,通過接口,由對象提供這些服務(wù),可以從對象查詢依賴性(例如,需要的附加服務(wù)),這種用的很少 |
| 類型?2 | 通過?JavaBean?的屬性(例如?setter?方法)分配依賴性 |
| 類型?3 | 依賴性以構(gòu)造函數(shù)的形式提供,不以?JavaBean?屬性的形式公開 |
Spring?框架的?IOC?容器主要采用類型?2?和類型3?實(shí)現(xiàn)。
?面向方面的編程,即?AOP,是一種編程技術(shù),它允許程序員對橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線的行為(例如日志和事務(wù)管理)進(jìn)行模塊化。AOP?的核心構(gòu)造是方面,它將那些影響多個(gè)類的行為封裝到可重用的模塊中。
AOP?和?IOC?是補(bǔ)充性的技術(shù),它們都運(yùn)用模塊化方式解決企業(yè)應(yīng)用程序開發(fā)中的復(fù)雜問題。在典型的面向?qū)ο箝_發(fā)方式中,可能要將日志記錄語句放在所有方法和?Java?類中才能實(shí)現(xiàn)日志功能。在?AOP?方式中,可以反過來將日志服務(wù)模塊化,并以聲明的方式將它們應(yīng)用到需要日志的組件上。當(dāng)然,優(yōu)勢就是?Java?類不需要知道日志服務(wù)的存在,也不需要考慮相關(guān)的代碼。所以,用?Spring?AOP?編寫的應(yīng)用程序代碼是松散耦合的。AOP?的功能完全集成到了?Spring?事務(wù)管理、日志和其他各種特性的上下文中。
IOC?容器:Spring?設(shè)計(jì)的核心是?org.springframework.beans?包,它的設(shè)計(jì)目標(biāo)是與?JavaBean?組件一起使用。這個(gè)包通常不是由用戶直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介。下一個(gè)最高級抽象是?BeanFactory?接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn),允許通過名稱創(chuàng)建和檢索對象。BeanFactory?也可以管理對象之間的關(guān)系。
BeanFactory?支持兩個(gè)對象模型:
1.單態(tài)?模型提供了具有特定名稱的對象的共享實(shí)例,可以在查詢時(shí)對其進(jìn)行檢索。Singleton?是默認(rèn)的也是最常用的對象模型。對于無狀態(tài)服務(wù)對象很理想。
2.?原型?模型確保每次檢索都會創(chuàng)建單獨(dú)的對象。在每個(gè)用戶都需要自己的對象時(shí),原型模型最適合。
bean?工廠的概念是?Spring?作為?IOC?容器的基礎(chǔ)。IOC?將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架。正如我將在下一個(gè)示例中演示的那樣,Spring?框架使用?JavaBean?屬性和配置數(shù)據(jù)來指出必須設(shè)置的依賴關(guān)系。?
??????Spring的源碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)用,處處體現(xiàn)著大師對java設(shè)計(jì)模式靈活運(yùn)用以及對Java技術(shù)的高深造詣。Spring框架源碼無疑是Java技術(shù)的最佳實(shí)踐范例。如果想在短時(shí)間內(nèi)迅速提高自己的Java技術(shù)水平和應(yīng)用開發(fā)水平,學(xué)習(xí)和研究Spring源碼將會使你收到意想不到的效果。?可是從哪著手研究Spring卻是很多新手頭疼的地方,下面的參考資料將帶領(lǐng)大家慢慢的深入解析Spring?
1?Spring中的事務(wù)處理
2?ioc容器在Web容器中的啟動
3?Spring?JDBC
4?Spring?MVC
5?Spring?AOP獲取Proxy
6?Spring聲明式事務(wù)處理
7?Spring?AOP中對攔截器調(diào)用的實(shí)現(xiàn)
8?Spring驅(qū)動Hibernate的實(shí)現(xiàn)
9?Spring?Acegi框架鑒權(quán)的實(shí)現(xiàn)
具體的源碼解析內(nèi)容大家可以百度或者谷歌一下,可以找到大量源碼解析內(nèi)容。
from:?
? ? ? ? ?spring?是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為?J2EE?應(yīng)用程序開發(fā)提供集成的框架。??然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。?Spring的核心是個(gè)輕量級容器(Container),實(shí)現(xiàn)了IoC(Inversion?of?Control)模式的容器,Spring的目標(biāo)是實(shí)現(xiàn)一個(gè)全方位的整合框架,在Spring框架下實(shí)現(xiàn)多個(gè)子框架的組合,這些子框架之間彼此可以獨(dú)立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop?shop的框架整合方案?
??????簡單來說,Spring是一個(gè)輕量級的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架。
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對象不依賴于Spring的特定類。
控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對象依賴的其它對象會通過被動的方式傳遞進(jìn)來,而不是這個(gè)對象自己創(chuàng)建或者查找依賴對象。你可以認(rèn)為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時(shí)不等對象請求就主動將依賴傳遞給它。
面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識)其它的系統(tǒng)級關(guān)注點(diǎn),例如日志或事務(wù)支持。
容器——Spring包含并管理應(yīng)用對象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
框架——Spring可以將簡單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。 所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。?
Spring?框架是一個(gè)分層架構(gòu),由?7?個(gè)定義良好的模塊組成。Spring?模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理?bean?的方式,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
Spring?框架的分為7個(gè)模塊,組成?Spring?框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:?
1.核心容器:核心容器提供?Spring?框架的基本功能。核心容器的主要組件是?BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory?使用控制反轉(zhuǎn)?(IOC)?模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
2.Spring?上下文:Spring?上下文是一個(gè)配置文件,向?Spring?框架提上下文信息。Spring?上下文包括企業(yè)服務(wù),例如?JNDI、EJB、電子郵件、國際化、校驗(yàn)和調(diào)度功能。
3.Spring?AOP:通過配置管理特性,Spring?AOP?模塊直接將面向方面的編程功能集成到了?Spring?框架中。所以,可以很容易地使?Spring?框架管理的任何對象支持?AOP。Spring?AOP?模塊為基于?Spring?的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用?Spring?AOP,不用依賴?EJB?組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
?? ? ??4.?Spring?DAO:JDBC?DAO?抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring?DAO?的面向?JDBC?的異常遵從通用的?DAO?異常層次結(jié)構(gòu)。
? ? ??5.Spring?ORM:Spring?框架插入了若干個(gè)?ORM?框架,從而提供了?ORM?的對象關(guān)系工具,其中包括?JDO、hibernate?和?iBatis?SQL?Map。所有這些都遵從?Spring?的通用事務(wù)和?DAO?異常層次結(jié)構(gòu)。
6.?Spring?Web?模塊:Web?上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于?Web?的應(yīng)用程序提供了上下文。所以,Spring?框架支持與?Jakarta?Struts?的集成。Web?模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/span>
7.?Spring?MVC?框架:MVC?框架是一個(gè)全功能的構(gòu)建?Web?應(yīng)用程序的?MVC?實(shí)現(xiàn)。通過策略接口,MVC?框架變成為高度可配置的,MVC?容納了大量視圖技術(shù),其中包括?JSP、Velocity、Tiles、iText?和?POI。
?Spring?框架的功能可以用在任何?J2EE?服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring?的核心要點(diǎn)是:支持不綁定到特定?J2EE?服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問對象。毫無疑問,這樣的對象可以在不同?J2EE?環(huán)境?(Web?或?EJB)、獨(dú)立應(yīng)用程序、測試環(huán)境之間重用。??
????????
總結(jié)起來,Spring有如下優(yōu)點(diǎn):
1.低侵入式設(shè)計(jì),代碼污染極低
2.?獨(dú)立于各種應(yīng)用服務(wù)器,可以真正實(shí)現(xiàn)Write?Once,Run?Anywhere的承諾
3.Spring的DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性
4.Spring并不完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部?????
?????IOC?和?AOP:這兩個(gè)概念可以算是spring中的核心了,這兩個(gè)概念非常抽象,并且也不容易理解,所以我們下面來簡單來描述一下這兩個(gè)概念。
??控制反轉(zhuǎn)模式(也稱作依賴性介入)的基本概念是:不創(chuàng)建對象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。容器?(在?Spring?框架中是?IOC?容器)?負(fù)責(zé)將這些聯(lián)系在一起。在典型的?IOC?場景中,容器創(chuàng)建了所有對象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了?IOC?的一個(gè)實(shí)現(xiàn)模式。
| 類型?1 | 服務(wù)需要實(shí)現(xiàn)專門的接口,通過接口,由對象提供這些服務(wù),可以從對象查詢依賴性(例如,需要的附加服務(wù)),這種用的很少 |
| 類型?2 | 通過?JavaBean?的屬性(例如?setter?方法)分配依賴性 |
| 類型?3 | 依賴性以構(gòu)造函數(shù)的形式提供,不以?JavaBean?屬性的形式公開 |
Spring?框架的?IOC?容器主要采用類型?2?和類型3?實(shí)現(xiàn)。
?面向方面的編程,即?AOP,是一種編程技術(shù),它允許程序員對橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線的行為(例如日志和事務(wù)管理)進(jìn)行模塊化。AOP?的核心構(gòu)造是方面,它將那些影響多個(gè)類的行為封裝到可重用的模塊中。
AOP?和?IOC?是補(bǔ)充性的技術(shù),它們都運(yùn)用模塊化方式解決企業(yè)應(yīng)用程序開發(fā)中的復(fù)雜問題。在典型的面向?qū)ο箝_發(fā)方式中,可能要將日志記錄語句放在所有方法和?Java?類中才能實(shí)現(xiàn)日志功能。在?AOP?方式中,可以反過來將日志服務(wù)模塊化,并以聲明的方式將它們應(yīng)用到需要日志的組件上。當(dāng)然,優(yōu)勢就是?Java?類不需要知道日志服務(wù)的存在,也不需要考慮相關(guān)的代碼。所以,用?Spring?AOP?編寫的應(yīng)用程序代碼是松散耦合的。AOP?的功能完全集成到了?Spring?事務(wù)管理、日志和其他各種特性的上下文中。
IOC?容器:Spring?設(shè)計(jì)的核心是?org.springframework.beans?包,它的設(shè)計(jì)目標(biāo)是與?JavaBean?組件一起使用。這個(gè)包通常不是由用戶直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介。下一個(gè)最高級抽象是?BeanFactory?接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn),允許通過名稱創(chuàng)建和檢索對象。BeanFactory?也可以管理對象之間的關(guān)系。
BeanFactory?支持兩個(gè)對象模型:
1.單態(tài)?模型提供了具有特定名稱的對象的共享實(shí)例,可以在查詢時(shí)對其進(jìn)行檢索。Singleton?是默認(rèn)的也是最常用的對象模型。對于無狀態(tài)服務(wù)對象很理想。
2.?原型?模型確保每次檢索都會創(chuàng)建單獨(dú)的對象。在每個(gè)用戶都需要自己的對象時(shí),原型模型最適合。
bean?工廠的概念是?Spring?作為?IOC?容器的基礎(chǔ)。IOC?將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架。正如我將在下一個(gè)示例中演示的那樣,Spring?框架使用?JavaBean?屬性和配置數(shù)據(jù)來指出必須設(shè)置的依賴關(guān)系。?
??????Spring的源碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)用,處處體現(xiàn)著大師對java設(shè)計(jì)模式靈活運(yùn)用以及對Java技術(shù)的高深造詣。Spring框架源碼無疑是Java技術(shù)的最佳實(shí)踐范例。如果想在短時(shí)間內(nèi)迅速提高自己的Java技術(shù)水平和應(yīng)用開發(fā)水平,學(xué)習(xí)和研究Spring源碼將會使你收到意想不到的效果。?可是從哪著手研究Spring卻是很多新手頭疼的地方,下面的參考資料將帶領(lǐng)大家慢慢的深入解析Spring?
1?Spring中的事務(wù)處理
2?ioc容器在Web容器中的啟動
3?Spring?JDBC
4?Spring?MVC
5?Spring?AOP獲取Proxy
6?Spring聲明式事務(wù)處理
7?Spring?AOP中對攔截器調(diào)用的實(shí)現(xiàn)
8?Spring驅(qū)動Hibernate的實(shí)現(xiàn)
9?Spring?Acegi框架鑒權(quán)的實(shí)現(xiàn)
具體的源碼解析內(nèi)容大家可以百度或者谷歌一下,可以找到大量源碼解析內(nèi)容。
http://blog.csdn.net/csh624366188/article/details/7633836
? ? ? ? ?spring?是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為?J2EE?應(yīng)用程序開發(fā)提供集成的框架。??然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。?Spring的核心是個(gè)輕量級容器(Container),實(shí)現(xiàn)了IoC(Inversion?of?Control)模式的容器,Spring的目標(biāo)是實(shí)現(xiàn)一個(gè)全方位的整合框架,在Spring框架下實(shí)現(xiàn)多個(gè)子框架的組合,這些子框架之間彼此可以獨(dú)立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop?shop的框架整合方案?
??????簡單來說,Spring是一個(gè)輕量級的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架。
輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對象不依賴于Spring的特定類。
控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對象依賴的其它對象會通過被動的方式傳遞進(jìn)來,而不是這個(gè)對象自己創(chuàng)建或者查找依賴對象。你可以認(rèn)為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時(shí)不等對象請求就主動將依賴傳遞給它。
面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識)其它的系統(tǒng)級關(guān)注點(diǎn),例如日志或事務(wù)支持。
容器——Spring包含并管理應(yīng)用對象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
框架——Spring可以將簡單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。 所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。?
Spring?框架是一個(gè)分層架構(gòu),由?7?個(gè)定義良好的模塊組成。Spring?模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理?bean?的方式,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
Spring?框架的分為7個(gè)模塊,組成?Spring?框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:?
1.核心容器:核心容器提供?Spring?框架的基本功能。核心容器的主要組件是?BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory?使用控制反轉(zhuǎn)?(IOC)?模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
2.Spring?上下文:Spring?上下文是一個(gè)配置文件,向?Spring?框架提上下文信息。Spring?上下文包括企業(yè)服務(wù),例如?JNDI、EJB、電子郵件、國際化、校驗(yàn)和調(diào)度功能。
3.Spring?AOP:通過配置管理特性,Spring?AOP?模塊直接將面向方面的編程功能集成到了?Spring?框架中。所以,可以很容易地使?Spring?框架管理的任何對象支持?AOP。Spring?AOP?模塊為基于?Spring?的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用?Spring?AOP,不用依賴?EJB?組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
?? ? ??4.?Spring?DAO:JDBC?DAO?抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring?DAO?的面向?JDBC?的異常遵從通用的?DAO?異常層次結(jié)構(gòu)。
? ? ??5.Spring?ORM:Spring?框架插入了若干個(gè)?ORM?框架,從而提供了?ORM?的對象關(guān)系工具,其中包括?JDO、hibernate?和?iBatis?SQL?Map。所有這些都遵從?Spring?的通用事務(wù)和?DAO?異常層次結(jié)構(gòu)。
6.?Spring?Web?模塊:Web?上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于?Web?的應(yīng)用程序提供了上下文。所以,Spring?框架支持與?Jakarta?Struts?的集成。Web?模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/span>
7.?Spring?MVC?框架:MVC?框架是一個(gè)全功能的構(gòu)建?Web?應(yīng)用程序的?MVC?實(shí)現(xiàn)。通過策略接口,MVC?框架變成為高度可配置的,MVC?容納了大量視圖技術(shù),其中包括?JSP、Velocity、Tiles、iText?和?POI。
?Spring?框架的功能可以用在任何?J2EE?服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring?的核心要點(diǎn)是:支持不綁定到特定?J2EE?服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問對象。毫無疑問,這樣的對象可以在不同?J2EE?環(huán)境?(Web?或?EJB)、獨(dú)立應(yīng)用程序、測試環(huán)境之間重用。??
????????
總結(jié)起來,Spring有如下優(yōu)點(diǎn):
1.低侵入式設(shè)計(jì),代碼污染極低
2.?獨(dú)立于各種應(yīng)用服務(wù)器,可以真正實(shí)現(xiàn)Write?Once,Run?Anywhere的承諾
3.Spring的DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性
4.Spring并不完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部?????
?????IOC?和?AOP:這兩個(gè)概念可以算是spring中的核心了,這兩個(gè)概念非常抽象,并且也不容易理解,所以我們下面來簡單來描述一下這兩個(gè)概念。
??控制反轉(zhuǎn)模式(也稱作依賴性介入)的基本概念是:不創(chuàng)建對象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。容器?(在?Spring?框架中是?IOC?容器)?負(fù)責(zé)將這些聯(lián)系在一起。在典型的?IOC?場景中,容器創(chuàng)建了所有對象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了?IOC?的一個(gè)實(shí)現(xiàn)模式。
| 類型?1 | 服務(wù)需要實(shí)現(xiàn)專門的接口,通過接口,由對象提供這些服務(wù),可以從對象查詢依賴性(例如,需要的附加服務(wù)),這種用的很少 |
| 類型?2 | 通過?JavaBean?的屬性(例如?setter?方法)分配依賴性 |
| 類型?3 | 依賴性以構(gòu)造函數(shù)的形式提供,不以?JavaBean?屬性的形式公開 |
Spring?框架的?IOC?容器主要采用類型?2?和類型3?實(shí)現(xiàn)。
?面向方面的編程,即?AOP,是一種編程技術(shù),它允許程序員對橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線的行為(例如日志和事務(wù)管理)進(jìn)行模塊化。AOP?的核心構(gòu)造是方面,它將那些影響多個(gè)類的行為封裝到可重用的模塊中。
AOP?和?IOC?是補(bǔ)充性的技術(shù),它們都運(yùn)用模塊化方式解決企業(yè)應(yīng)用程序開發(fā)中的復(fù)雜問題。在典型的面向?qū)ο箝_發(fā)方式中,可能要將日志記錄語句放在所有方法和?Java?類中才能實(shí)現(xiàn)日志功能。在?AOP?方式中,可以反過來將日志服務(wù)模塊化,并以聲明的方式將它們應(yīng)用到需要日志的組件上。當(dāng)然,優(yōu)勢就是?Java?類不需要知道日志服務(wù)的存在,也不需要考慮相關(guān)的代碼。所以,用?Spring?AOP?編寫的應(yīng)用程序代碼是松散耦合的。AOP?的功能完全集成到了?Spring?事務(wù)管理、日志和其他各種特性的上下文中。
IOC?容器:Spring?設(shè)計(jì)的核心是?org.springframework.beans?包,它的設(shè)計(jì)目標(biāo)是與?JavaBean?組件一起使用。這個(gè)包通常不是由用戶直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介。下一個(gè)最高級抽象是?BeanFactory?接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn),允許通過名稱創(chuàng)建和檢索對象。BeanFactory?也可以管理對象之間的關(guān)系。
BeanFactory?支持兩個(gè)對象模型:
1.單態(tài)?模型提供了具有特定名稱的對象的共享實(shí)例,可以在查詢時(shí)對其進(jìn)行檢索。Singleton?是默認(rèn)的也是最常用的對象模型。對于無狀態(tài)服務(wù)對象很理想。
2.?原型?模型確保每次檢索都會創(chuàng)建單獨(dú)的對象。在每個(gè)用戶都需要自己的對象時(shí),原型模型最適合。
bean?工廠的概念是?Spring?作為?IOC?容器的基礎(chǔ)。IOC?將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架。正如我將在下一個(gè)示例中演示的那樣,Spring?框架使用?JavaBean?屬性和配置數(shù)據(jù)來指出必須設(shè)置的依賴關(guān)系。?
??????Spring的源碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)用,處處體現(xiàn)著大師對java設(shè)計(jì)模式靈活運(yùn)用以及對Java技術(shù)的高深造詣。Spring框架源碼無疑是Java技術(shù)的最佳實(shí)踐范例。如果想在短時(shí)間內(nèi)迅速提高自己的Java技術(shù)水平和應(yīng)用開發(fā)水平,學(xué)習(xí)和研究Spring源碼將會使你收到意想不到的效果。?可是從哪著手研究Spring卻是很多新手頭疼的地方,下面的參考資料將帶領(lǐng)大家慢慢的深入解析Spring?
1?Spring中的事務(wù)處理
2?ioc容器在Web容器中的啟動
3?Spring?JDBC
4?Spring?MVC
5?Spring?AOP獲取Proxy
6?Spring聲明式事務(wù)處理
7?Spring?AOP中對攔截器調(diào)用的實(shí)現(xiàn)
8?Spring驅(qū)動Hibernate的實(shí)現(xiàn)
9?Spring?Acegi框架鑒權(quán)的實(shí)現(xiàn)
具體的源碼解析內(nèi)容大家可以百度或者谷歌一下,可以找到大量源碼解析內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ IDEA - 热部署插
- 下一篇: Java程序员从笨鸟到菜鸟之(六十八)细