Struts+Hibernate+Spring+三個(gè)框架簡(jiǎn)介_(kāi)第1頁(yè)
Struts+Hibernate+Spring+三個(gè)框架簡(jiǎn)介_(kāi)第2頁(yè)
Struts+Hibernate+Spring+三個(gè)框架簡(jiǎn)介_(kāi)第3頁(yè)
已閱讀5頁(yè),還剩6頁(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、開(kāi)源框架,是利用 Java Servlet 和 JSP 構(gòu)建 Web 應(yīng)用的一項(xiàng)非常有用的技術(shù)。由于 Struts 能充分滿足應(yīng)用開(kāi)發(fā)的需求,簡(jiǎn)單易用,敏捷迅速,因而吸引了眾多的開(kāi)發(fā)人員的關(guān)注。首先事件是指從客戶端頁(yè)面 (瀏覽器 )由用戶操作觸發(fā)的事件, Struts 使用 Action 來(lái) 接受瀏覽器表單提交的事件,這里使用了 Command 模式,每個(gè)繼承 Action 的子類(lèi)都必須 實(shí)現(xiàn)一個(gè) 方法 execute 。struts 重要的表單對(duì)象 Actio nF orm 是一種對(duì)象,它代表了一種應(yīng)用,這個(gè)對(duì)象中至少 包含幾 個(gè)字段,這些字段是 Jsp 頁(yè)面表單中的 in put 字段,因

2、為一個(gè)表單對(duì)應(yīng)一個(gè)事件,所 以,當(dāng)我們需要將事件粒度細(xì)化到表單中這些字段時(shí),也就是說(shuō),一個(gè)字段對(duì)應(yīng)一個(gè)事件 時(shí),單純使 用 Struts 就不太可能,當(dāng)然通過(guò)結(jié)合 JavaScript 也是可以轉(zhuǎn)彎實(shí)現(xiàn)的。Struts 是一個(gè)基于 Sun J2EE 平臺(tái)的 MVC 框架,主要是采用 Servlet 和 JSP 技術(shù)來(lái)實(shí)現(xiàn) 的。 Struts 把 Servlet 、 JSP 、自定義標(biāo)簽和信息資源 (message resources) 整合到一個(gè)統(tǒng)一的框 架中,開(kāi) 發(fā)人員利用其進(jìn)行開(kāi)發(fā)時(shí)不用再自己編碼實(shí)現(xiàn)全套 MVC 模式,極大的節(jié)省了時(shí) 間,所以說(shuō) Struts 是 一個(gè)非常不錯(cuò)的應(yīng)用框架。

3、Struts 框架可分為以下四個(gè)主要局部:1、 模型 (Model) ,本質(zhì)上來(lái)說(shuō)在 Struts 中 Model 是一個(gè) Action 類(lèi)(這個(gè)會(huì)在后面詳細(xì)討 論 ),開(kāi)發(fā)者通過(guò)其實(shí)現(xiàn)商業(yè)邏輯,同時(shí)用戶請(qǐng)求通過(guò)控制器(Controller) 向 Action 的轉(zhuǎn)發(fā)過(guò)程是基于由 struts- config.xml 文件描述的配置信息的。2、 視圖( View) ,View 是由與控制器 Servlet 配合工作的一整套 JSP 定制標(biāo)簽庫(kù)構(gòu)成, 利用 她們我們可以快速建立應(yīng)用系統(tǒng)的界面。3 、 控制器 (Controller) ,本質(zhì)上是一個(gè) Servlet ,將客戶端請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的 A

4、ction 類(lèi)。4 、 一堆用來(lái)做 XML 文件解析的工具包, Struts 是用 XML 來(lái)描述如何自動(dòng)產(chǎn)生一些 JavaBean 的屬性的,此外 Struts 還利用 XML 來(lái)描述在國(guó)際化應(yīng)用中的用戶提示信息的 ( 這 樣一來(lái)就實(shí)現(xiàn)了應(yīng)用系統(tǒng)的多語(yǔ)言支持)。HibernateHibernate 是一個(gè)免費(fèi)的開(kāi)源 Java 包,它使得與關(guān)系數(shù)據(jù)庫(kù)打交道變得十分輕松,就像 您的數(shù)據(jù) 庫(kù)中包含每天使用的普通 Java 對(duì)象一樣,同時(shí)不必考慮如何把它們從神秘的數(shù)據(jù) 庫(kù)表中取出或放回 到數(shù)據(jù)庫(kù)表中 。它解放了您,使您可以專(zhuān)注于應(yīng)用程序的對(duì)象和功能, 而不必?fù)?dān)憂如何保存它們或 稍后如何找到它們。大多

5、數(shù)應(yīng)用程序都需要處理數(shù)據(jù)。 Java 應(yīng)用程序運(yùn)行時(shí),往往把數(shù)據(jù)封裝為相互連接 的對(duì)象網(wǎng)絡(luò),但是當(dāng)程序結(jié)束時(shí),這些對(duì)象就會(huì)消失在一團(tuán)邏輯中,所以需要有一些保存 它們的方法。 有時(shí)候,甚至在編寫(xiě)應(yīng)用程序之前,數(shù)據(jù)就已經(jīng)存在了,所以需要有讀入它 們和將其表示為對(duì)象的方 法。手動(dòng)編寫(xiě)代碼來(lái)執(zhí)行這些任務(wù)不僅單調(diào)乏味、易于出錯(cuò),而 且會(huì)占用整個(gè)應(yīng)用程序的很大一局部 開(kāi)發(fā)工作量。優(yōu)秀的面向?qū)ο箝_(kāi)發(fā)人員厭倦了這種重復(fù)性的勞動(dòng), 他們開(kāi)始采用通常的“積極偷 懶做法,即, 創(chuàng)立工具,使整個(gè)過(guò)程自動(dòng)化。 對(duì)于關(guān)系數(shù)據(jù)庫(kù)來(lái)說(shuō), 這種努力的最大成果 就是對(duì)象 /關(guān)系映射 ORM 工具。這類(lèi)工具有很多,從昂貴的商業(yè)產(chǎn)品

6、到內(nèi)置于 J2EE 中的 EJB 標(biāo)準(zhǔn)。然而,在很多情 況下,這些工具具有自身的復(fù)雜性,使得開(kāi)發(fā)人員必須學(xué)習(xí)使用它們的詳細(xì)規(guī)那么,并修改 組成應(yīng)用程 序的類(lèi)以滿足映射系統(tǒng)的需要。由于這些工具為應(yīng)付更加嚴(yán)格和復(fù)雜的企業(yè)需 求而不斷開(kāi)展,于是在 比擬簡(jiǎn)單和常見(jiàn)的場(chǎng)景中, 使用它們所面臨的復(fù)雜性反而蓋過(guò)了所 能獲得的好處。 這引起了一場(chǎng)革命, 促進(jìn)了輕量級(jí)解決方案的出現(xiàn),而 Hibernate 就是這樣 的一個(gè)例子。Hibernate 的工作方式Hibernate 不會(huì)對(duì)您造成阻礙,也不會(huì)強(qiáng)迫您修改對(duì)象的行為方式。它們不需要實(shí)現(xiàn)任何不可思議的接口以便能夠持續(xù)存在。惟一需要做的就是創(chuàng)立一份 XML “

7、映射文檔,告 訴 Hibernate 您希望能夠保存在數(shù)據(jù)庫(kù)中的類(lèi),以及它們?nèi)绾侮P(guān)聯(lián)到該數(shù)據(jù)庫(kù)中的表和列,然后就可以要求它以對(duì)象的形式獲取數(shù)據(jù),或者把對(duì)象保存為數(shù)據(jù)。與其他解決方案相比, 它幾乎已經(jīng)很完美 了。由于本文只是一篇介紹性的文章,所以不會(huì)引入構(gòu)建和使用 Hibernate 映射文檔的具體 例子我 在? Hibernate: A Developer's Notebook ?一書(shū)的頭幾章中已經(jīng)介紹了一個(gè)例子 。 此外,在網(wǎng)上和 Hibernate 的在線文檔中,還可以找到一些不錯(cuò)的例子,請(qǐng)參見(jiàn)下面的“其 他信息局部。它實(shí)際上相 當(dāng)直觀。應(yīng)用程序?qū)ο笾械膶傩砸砸环N簡(jiǎn)單而自然的方式與

8、正 確的數(shù)據(jù)庫(kù)結(jié)構(gòu)相關(guān)聯(lián)。運(yùn)行時(shí), Hibernate 讀取映射文檔,然后動(dòng)態(tài)構(gòu)建 Java 類(lèi),以便管理數(shù)據(jù)庫(kù)與 Java 之 間的轉(zhuǎn)換。在 Hibernate 中有一個(gè)簡(jiǎn)單而直觀的 API ,用于對(duì)數(shù)據(jù)庫(kù)所表示的對(duì)象執(zhí)行查詢。 要修改 這些對(duì)象,一般情況下只需在程序中與它們進(jìn)行交互,然后告訴 Hibernate 保存 修改即可。類(lèi)似地,創(chuàng)立新對(duì)象也很簡(jiǎn)單;只需以常規(guī)方式創(chuàng)立它們,然后告訴 Hibernate 有關(guān)它們的信息,這樣就能在數(shù)據(jù)庫(kù)中保存它們。Hibernate API 學(xué)習(xí)起來(lái)很簡(jiǎn)單,而且它與程序流的交互相當(dāng)自然。在適當(dāng)?shù)奈恢谜{(diào)用 它,就可以 達(dá)成目的。它帶來(lái)了很多自動(dòng)化和代碼節(jié)

9、省方面的好處,所以花一點(diǎn)時(shí)間學(xué)習(xí) 它是值得的。而且還可 以獲得另一個(gè)好處,即代碼不用關(guān)心要使用的數(shù)據(jù)庫(kù)種類(lèi)否那么的 話甚至必須知道 。我所在的公司 就曾有過(guò)在開(kāi)發(fā)過(guò)程后期被迫更換數(shù)據(jù)庫(kù)廠商的經(jīng)歷。這 會(huì)造成巨大的災(zāi)難,但是借助于Hibernate ,只需要簡(jiǎn)單地修改 Hibernate 配置文件即可。這里的討論假定您已經(jīng)通過(guò)創(chuàng)立 Hibernate 映射文檔,建立了一個(gè)關(guān)系數(shù)據(jù)庫(kù),并且擁 有要映射的 Java 類(lèi)。有一個(gè) Hibernate " 工具集可在編譯時(shí)使用,以支持不同的工作流。例如,如果您已經(jīng)擁有 Java 類(lèi)和映射文檔, Hibernate 可以為您創(chuàng)立或更新必需的數(shù)據(jù)

10、庫(kù)表。或者,僅僅從映射文檔開(kāi)始, Hibernate 也能夠生成數(shù)據(jù)類(lèi)?;蛘撸梢苑聪蛟O(shè)計(jì) 您的數(shù)據(jù) 庫(kù)和類(lèi),從而擬定映射文檔。還有一些用于 Eclipse 的 alpha 插件,它們可以在 IDE 中提供智能的編輯支持以及對(duì)這些工具的圖形訪問(wèn)。如果您使用的是 Hibernate 2 環(huán)境,這些工具鮮有提供,但是存在可用的第三方工具。使用 Hibernate 的場(chǎng)合既然 Hibernate 看起來(lái)如此靈活好用,為什么還要使用其他的工具呢?下面有一些場(chǎng)景, 可以幫 助您做出判斷或許通過(guò)提供一些比擬和上下文,可以有助于鑒別非常適用Hibernate 的場(chǎng)合。如果應(yīng)用對(duì)于數(shù)據(jù)存儲(chǔ)的需要十分簡(jiǎn)單例如

11、,您只想管理一組用戶優(yōu)先選擇 您根本不需 要數(shù)據(jù)庫(kù),更不用說(shuō)一個(gè)優(yōu)秀的對(duì)象-關(guān)系映射系統(tǒng)了即使它也如Hibernate這般易于使用 !從 Java 1.4 開(kāi)始,有一個(gè)標(biāo)準(zhǔn)的 Java Preferences API 可以很好地發(fā)揮這 個(gè)作用。 在 ONJava 文章中可以找到有關(guān) PreferencesAPI 的更多信息。對(duì)于熟悉使用關(guān)系數(shù)據(jù)庫(kù)和了解如何執(zhí)行完美的 SQL 查詢與企業(yè)數(shù)據(jù)庫(kù)交互的人來(lái)說(shuō), Hibernate 似乎有些礙手礙腳,這就像帶有動(dòng)力和自動(dòng)排擋的快艇車(chē)會(huì)使注重性能的賽車(chē)駕駛員不耐煩一樣。如果您屬于這種人,如果您所在的工程團(tuán)隊(duì)擁有一個(gè)強(qiáng)大的DBA ,或者有一些存儲(chǔ)過(guò)程要處

12、理,您可能想研究一下 iBATIS 。 Hibernate 的創(chuàng)立者本身就把 iBATIS 當(dāng)作是另 一種有趣的選擇。我對(duì)它很有興趣,因?yàn)槲覀冊(cè)鵀橐粋€(gè)電子商務(wù)站點(diǎn)開(kāi)發(fā)了一個(gè)類(lèi)似的系統(tǒng)其功能更為強(qiáng)大 ,而且從那時(shí)到現(xiàn)在,我們已經(jīng)在其他環(huán)境中使用過(guò)它,盡 管在發(fā)現(xiàn) Hibernate 之后,在 新工程中我們通常更喜歡使用 Hibernate 。您可以認(rèn)為,以 SQL 為中心的解決方案比方 iBATIS 是“反向的對(duì)象 /關(guān)系映射工具,而 Hibernate 是 一個(gè)更為 傳統(tǒng)的 ORM 。當(dāng)然,還有其他的外部原因會(huì)導(dǎo)致采用另外的方法。 比方,在一個(gè)企業(yè)環(huán)境中, 必須 使用成熟的 EJB 架構(gòu)或者其

13、他的一些非普通對(duì)象映射系統(tǒng) ??梢詾樘峁┳约旱臄?shù)據(jù)存 儲(chǔ)工具的平臺(tái)量身定做代碼, 比方Mac OS X's Core Data 。使用的可能是像 XML DTD 這樣的存儲(chǔ)標(biāo)準(zhǔn),而它根本不涉及關(guān)系數(shù)據(jù)庫(kù)。但是,如果您使用的是富對(duì)象模型,而且想要靈活、輕松且高效地保存它無(wú)論您是 否正要開(kāi)始 或已經(jīng)決定使用關(guān)系數(shù)據(jù)庫(kù),只要這是一個(gè)選擇而且存在可用的優(yōu)秀免費(fèi) 數(shù)據(jù)庫(kù),比方 MySQL ,或可嵌入 Java 的 HSQLDB ,它就應(yīng)該始終是一個(gè)選擇,那么Hibernate 很可能就是您理想的選擇。 您可能會(huì)驚訝于節(jié)省的時(shí)間之多, 以及您將會(huì)多么地 喜歡使用它 springSpring 是一個(gè)

14、開(kāi)源框架,它由 Rod Johnson 創(chuàng)立。它是為了解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而 創(chuàng)立的。 Spring 使用根本的 JavaBean 來(lái)完成以前只可能由 EJB 完成的事情。然而, Spring 的用途不 僅限于效勞器端的開(kāi)發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何 Java 應(yīng) 用都可以從 Spring 中受益。" 目的:解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性"功能:使用根本的 JavaBean 代替 EJB ,并提供了更多的企業(yè)應(yīng)用功能" 范圍:任何 Java 應(yīng)用簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)loC和面向切面AOP 的容器框架。 輕量從大小與開(kāi)銷(xiāo)兩方面

15、而言 Spring 都是輕量的。完整的 Spring 框架可以在一個(gè) 大小只 有 1MB 多的 JAR 文件里發(fā)布。并且 Spring 所需的處理開(kāi)銷(xiāo)也是微缺乏道的。此外, Spring 是非侵 入式的:典型地, Spring 應(yīng)用中的對(duì)象不依賴(lài)于 Spring 的特定類(lèi)。 控制反轉(zhuǎn)- Spring通過(guò)一種稱(chēng)作控制反轉(zhuǎn)IoC的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴(lài)的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái),而不是這個(gè)對(duì)象自己創(chuàng)立或者查找依賴(lài)對(duì)象。你可以認(rèn)為 IoC 與 JNDI 相反不是對(duì)象沉著器中查找依賴(lài),而是容器 在對(duì)象初始化時(shí)不等對(duì) 象請(qǐng)求就主動(dòng)將依賴(lài)傳遞給它。 面向切面 Spring

16、提供了面向切面編程的豐富支持,允許通過(guò)別離應(yīng)用的業(yè)務(wù)邏輯與 系統(tǒng)級(jí)服 務(wù)例如審計(jì) audit ing 和事務(wù)管理進(jìn)行內(nèi)聚性的開(kāi)發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn) 它們應(yīng)該做的完 成業(yè)務(wù)邏輯僅此而已。它們并不負(fù)責(zé)甚至是意識(shí)其它的系統(tǒng) 級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。 容器 Spring 包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(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)的重量級(jí)的EJB 容器,它們經(jīng)常是龐大與笨重的,難

17、以使用。 框架 Spring 可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用。在 Spring 中,應(yīng)用對(duì) 象被聲 明式地組合,典型地是在一個(gè) XML 文件里。 Spring 也提供了很多根底功能事務(wù) 管理、持久化框架 集成等等 ,將應(yīng)用邏輯的開(kāi)發(fā)留給了你。所有 Spring 的這些特征使你能夠編寫(xiě)更干凈、更可管理、并且更易于測(cè)試的代碼。它們也為 Spring 中的各種模塊提供了根底支持。在這由三局部組成的介紹 Spring 框架的系列文章的第一期中,將開(kāi)始學(xué)習(xí)如何用 Spring 技術(shù)構(gòu)建輕量 級(jí)的、強(qiáng)壯的 J2EE 應(yīng)用程序。 developerWorks 的定期投稿人 NaveenBalani

18、 通過(guò)介紹 Spring 框架開(kāi)始了他由三局部組成的 Spring 系列,其中還將介紹Spring 面向方面的編程 AOP 和控制反轉(zhuǎn) IOC 容器。Spring 是一個(gè)開(kāi)源框架,是為了解決企業(yè)應(yīng)用程序開(kāi)發(fā)復(fù)雜性而創(chuàng)立的??蚣艿闹饕獌?yōu)勢(shì) 之一就是其 分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開(kāi)發(fā) 提供集成的框架。 在這篇由三局部組成的 Spring 系列 的第 1 局部中,我將介紹 Spring 框架。我先從框架 底層模型的 角度描述該框架的功能,然后將討論兩個(gè)最有趣的模塊: Spring 面向 方面編程 IOC 容器在典型應(yīng)用程序AOP 和控制反轉(zhuǎn) IOC 容器。

19、接著將使用幾個(gè)例如演示 用例場(chǎng)景中的應(yīng)用情況。這些例如還 將成為本系列后面局部進(jìn)行的展開(kāi)式討論的根底,在 本文的后面局部,將介紹 Spring 框架通過(guò) Spring AOP 實(shí)現(xiàn) AOP 構(gòu)造的方式。 請(qǐng)參閱 下載,下載 Spring 框架和 Apache Ant ,運(yùn)行本系列的例如應(yīng) 用程序需要它們。Spring 框架Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成。 Spring 模塊構(gòu)建在核心容器 之上,核心 容器定義了創(chuàng)立、配置和管理 bean 的方式,如圖 1 所示。圖 1. Spring 框架的 7 個(gè)模塊 組成 Spring 框架的每個(gè)模塊或組件都可以單獨(dú)存在,或

20、者與其他一 個(gè)或多個(gè)模塊聯(lián) 合實(shí)現(xiàn)。每個(gè)模塊的功能如下:核心容器:核心容器提供 Spring 框架的根本功能。核心容器的主要組件是 BeanFactory , 它是工廠模式的實(shí)現(xiàn)。 BeanFactory 使用控制反轉(zhuǎn) IOC 模式將應(yīng)用程序的配置和依賴(lài) 性標(biāo)準(zhǔn)與 實(shí)際的應(yīng)用程序代碼分開(kāi)。Spring 上下文: Spring 上下文是一個(gè)配置文件,向 Spring 框架提供上下文信息。 Spring 上下文包括 企業(yè)效勞,例如JNDI 、EJB 、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。Spring AOP :通過(guò)配置管理特性, Spring AOP 模塊直接將面向方面的編程功能集成到了Spring

21、 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持 AOP 。 Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理效勞。通過(guò)使用 Spring AOP ,不用依賴(lài) EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。Spring DAO :JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處 理和不同數(shù) 據(jù)庫(kù)供給商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低 了需要編寫(xiě)的異常代碼 數(shù)量例如翻開(kāi)和關(guān)閉連接 。 Spring DAO 的面向 JDBC 的異常遵 從通用的 DAO 異常層次結(jié)構(gòu)。Spring ORM

22、 :Spring 框架插入了假設(shè)干個(gè) ORM 框架,從而提供了 ORM 的對(duì)象關(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 模塊還簡(jiǎn)化 了處理多局部請(qǐng)求以 及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ?。Spring MVC 框架: MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)。通

23、過(guò) 策略接口, MVC 框架變成為高度可配置的, MVC 容納了大量視圖技術(shù), 其中包括 JSP 、Velocity 、Tiles 、iText 和 POI。 Spring 框架的功能可以用在任何 J2EE 效勞器中,大多數(shù)功能也適用于不受管理的環(huán)境。 Spring 的核 心要點(diǎn)是:支持不綁定到特定 J2EE 效勞的可重用業(yè)務(wù)和數(shù)據(jù)訪問(wèn)對(duì)象。毫無(wú) 疑問(wèn),這樣的對(duì)象可以 在不同 J2EE 環(huán)境 Web 或 EJB 、獨(dú)立應(yīng)用程序、測(cè)試環(huán)境之 間重用。回頁(yè)首IOC 和 AOP 控制反轉(zhuǎn)模式也稱(chēng)作依賴(lài)性介入 的根本概念是: 不創(chuàng)立對(duì)象,但是描述創(chuàng)立它們的方 式。在代碼中不直接與對(duì)象和效勞連接, 但在

24、配置文件中描述哪一個(gè)組件需要哪一項(xiàng)效勞。容器在 Spring框架中是 IOC 容器 負(fù)責(zé)將這些聯(lián)系在一起。在典型的 IOC 場(chǎng)景中,容器創(chuàng)立了所有對(duì)象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了 IOC 的一個(gè)實(shí)現(xiàn)模式。類(lèi)型 1 效勞需要實(shí)現(xiàn)專(zhuān)門(mén)的接口,通過(guò)接口,由對(duì)象提供這些效勞,可以從對(duì)象查詢依賴(lài)性例如,需要的附加效勞 類(lèi)型 2 通過(guò) JavaBean 的屬性例如 setter 方法分配依賴(lài)性類(lèi)型 3 依賴(lài)性以構(gòu)造函數(shù)的形式提供,不以 JavaBean 屬性的形式公開(kāi)Spring 框架的 IOC 容器采用類(lèi)型 2 和類(lèi)型 3 實(shí)現(xiàn)。 面向方面的編程面向方面的編程,即

25、 AOP ,是一種編程技術(shù),它允許程序員對(duì)橫切關(guān)注點(diǎn)或橫切典型的職 責(zé)分界線的 行為例如日志和事務(wù)管理進(jìn)行模塊化。 AOP 的核心構(gòu)造是方面,它將那些 影響多個(gè)類(lèi)的行為封裝 到可重用的模塊中AOP 和 IOC 是補(bǔ)充性的技術(shù),它們都運(yùn)用模塊化方式解決企業(yè)應(yīng)用程序開(kāi)發(fā)中的復(fù)雜問(wèn) 題。在典型的 面向?qū)ο箝_(kāi)發(fā)方式中,可能要將日志記錄語(yǔ)句放在所有方法和 Java 類(lèi)中才 能實(shí)現(xiàn)日志功能。在 AOP 方式中,可以反過(guò)來(lái)將日志效勞模塊化,并以聲明的方式將它 們應(yīng)用到需要 日志的組件上。 當(dāng)然,優(yōu)勢(shì)就是 Java 類(lèi)不需要知道日志效勞的存在, 也不 需要考慮相關(guān)的代碼。 所以, 用 Spring AOP 編

26、寫(xiě)的應(yīng)用程序代碼是松散耦合的。AOP 的功能完全集成到了 Spring 事務(wù)管理、日志和其他各種特性的上下文中。 回頁(yè)首IOC 容器Spring 設(shè)計(jì)的核心是 org.springframework.beans 包,它的設(shè)計(jì)目標(biāo)是與 JavaBean 組件一 起使用。 這個(gè)包通常不是由用戶直接使用,而是由效勞器將其用作其他多數(shù)功能的底層中 介。下一個(gè)最高級(jí)抽 象是 BeanFactory 接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn),允許通過(guò)名稱(chēng)創(chuàng) 建和檢索對(duì)象。 BeanFactory 也 可以管理對(duì)象之間的關(guān)系。BeanFactory 支持兩個(gè)對(duì)象模型。單態(tài) 模型提供了具有特定名稱(chēng)的對(duì)象的共享實(shí)例,可以在

27、查詢時(shí)對(duì)其進(jìn)行檢索。 Singleton 是默認(rèn)的也 是最常用的對(duì)象模型。對(duì)于無(wú)狀態(tài)效勞對(duì)象很理想。原型 模型確保每次檢索都會(huì)創(chuàng)立單獨(dú)的對(duì)象。在每個(gè)用戶都需要自己的對(duì)象時(shí),原型模型 最適合。 bean 工廠的概念是 Spring 作為 IOC 容器的根底。 IOC 將處理事情的責(zé)任從應(yīng)用程序代 碼轉(zhuǎn)移到框 架。正如我將在下一個(gè)例如中演示的那樣, Spring 框架使用 JavaBean 屬性和 配置數(shù)據(jù)來(lái)指出必須設(shè) 置的依賴(lài)關(guān)系。BeanFactory 接口因?yàn)?org.springframework.beans.factory.BeanFactory 是一個(gè)簡(jiǎn)單接口,所以可以針對(duì)各種底 層存

28、儲(chǔ) 方法實(shí)現(xiàn)。最常用的 BeanFactory 定義是 XmlBeanFactory ,它根據(jù) XML 文件中 的定義裝入 bea n, 如清單 1 所示。清單 1. XmlBeanFactory在 XML 文件中定義的 Bean 是被消極加載的 , 這意味在需要 bean 之前 , bean 本身不會(huì) 被初始化。要從 Bea nFactory 檢索 bea n , 只需調(diào)用getBea n() 方法,傳入將要檢索的bean 的名稱(chēng)即可 , 如清單 2 所示。清單 2. getBean()MyBean mybean = (MyBean) factory.getBean("mybean

29、");每個(gè) bean 的定義都可以是 POJO ( 用類(lèi)名和 JavaBean 初始化屬性定義 ) 或 FactoryBean 。 FactoryBean 接口為使用 Spring 框架構(gòu)建的應(yīng)用程序添加了一個(gè)間接的級(jí)別。IOC 例如 理解控制反轉(zhuǎn)最簡(jiǎn)單的方式就是看它的實(shí)際應(yīng)用。在對(duì)由三局部組成的 Spring 系列 的第 1 局部進(jìn)行總結(jié)時(shí),我使用了一個(gè)例如,演示了如何通過(guò)Spring IOC 容器注入應(yīng)用程序 的依賴(lài)關(guān)系 而不是將它們構(gòu)建進(jìn)來(lái) 。 我用開(kāi)啟在線信用帳戶的用例作為起點(diǎn)。對(duì)于該實(shí)現(xiàn),開(kāi)啟信用帳戶要求用 戶與以下效勞 進(jìn)行交互: 信用級(jí)別評(píng)定效勞,查詢用戶的信用歷史信息

30、。 遠(yuǎn)程信息鏈接效勞,插入 客戶信息,將客戶信息與信用卡和銀行信息連接起來(lái),以進(jìn)行自動(dòng)借記 如果需要的話 。電子郵件效勞,向用戶發(fā)送有關(guān)信用卡狀態(tài)的電子郵件。回頁(yè)首三個(gè)接口 對(duì)于這個(gè)例如, 我假設(shè)效勞已經(jīng)存在, 理想的情況是用松散耦合的方式把它們集成在一起。 以 下清單顯示了三個(gè)效勞的應(yīng)用程序接口。清單 3. CreditRatingInterfacepublic interface CreditRatingInterface public boolean getUserCreditHistoryInformation(ICustomer iCustomer);清單 3 所示的信用級(jí)別評(píng)定接口

31、提供了信用歷史信息。它需要一個(gè)包含客戶信息的 Customer 對(duì)象。 該接口的實(shí)現(xiàn)是由 CreditRating 類(lèi)提供的。清單 4. CreditLinkingInterfacepublic interface CreditLinkingInterface public String getUrl();public void setUrl(String url);public void linkCreditBankAccount() throws Exception ;信用鏈接接口將信用歷史信息與銀行信息 如果需要的話 連接在一起,并插入用戶的信 用卡信息。信用鏈接接口是一個(gè)遠(yuǎn)程效勞,它的

32、查詢是通過(guò) getUrl 方法進(jìn)行的。 URL 由 Spring 框架的 bean 配置機(jī)制設(shè)置,我稍后會(huì)討論它。該接口的實(shí)現(xiàn)是由 CreditLinking 類(lèi)提供的 清單 5. EmailInterfacepublic interface EmailInterface public void sendEmail(ICustomer iCustomer);public String getFromEmail();public void setFromEmail(String fromEmail) ;public String getPassword();public void setPass

33、word(String password) ;public String getSmtpHost() ;public void setSmtpHost(String smtpHost);public String getUserId() ;public void setUserId(String userId);EmailInterface 負(fù)責(zé)向客戶發(fā)送關(guān)于客戶信用卡狀態(tài)的電子郵件。郵件配置參數(shù)( 例如SMPT 主機(jī)、用戶名、口令 ) 由前面提到的 bean 配置機(jī)制設(shè)置。 Email 類(lèi)提供了該接口 的實(shí)現(xiàn)?;仨?yè)首Spring 使其保持松散 這些接口就位之后,接下來(lái)要考慮的就是如何用松散耦

34、合方式將它們集成在一起。在 清單 6 中可以看到信用卡帳戶用例的實(shí)現(xiàn)。注意,所有的 setter 方法都是由 Spring 的配置 bean 實(shí)現(xiàn)的。所有的依賴(lài)關(guān)系 ( 也就是 三個(gè)接口 ) 都可以由 Spring 框架用這些 bean 注入。 createCreditCardAccount() 方法會(huì)用 效勞去執(zhí)行其余實(shí) 現(xiàn)。在 清單 7 中可以看到 Spring 的配置文件。我用箭頭突出了這些 定義。運(yùn)行應(yīng)用程序 要運(yùn)行例如應(yīng)用程序,首先必須 下載 Spring 框架 及其所有依賴(lài)文件。接下來(lái),將框 架 釋放到 ( 比方說(shuō) ) 磁盤(pán) ,這會(huì)創(chuàng)立 C:spring-framework-1.2-rc2 ( 適用于當(dāng)前發(fā)行版本 ) 這樣的文件 夾。在繼續(xù)后面的操作之前,還必須下載和釋放 Apache Ant 。 接

溫馨提示

  • 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)論