【匯總】Spring 框架專題

1 Spring框架

1.1 Spring框架

??? Spring框架是一個分層架構(gòu),由7個定義良好的模塊組成巧婶。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式澜汤,如圖1所示。

圖1. Spring 框架的7個模塊

??? 組成Spring框架的每個模塊(或組件)都可以單獨(dú)存在舵匾,或者與其他一個或多個模塊聯(lián)合實(shí)現(xiàn)俊抵。每個模塊的功能如下:

????? ? 核心容器:核心容器提供Spring框架的基本功能。核心容器的主要組件是BeanFactory坐梯,它是工廠模式的實(shí)現(xiàn)徽诲。BeanFactory使用控制反轉(zhuǎn)(IOC)模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。

????? ? Spring上下文: Spring上下文是一個配置文件吵血,向 Spring 框架提供上下文信息谎替。Spring 上下文包括企業(yè)服務(wù),例如 JNDI蹋辅、EJB钱贯、電子郵件、國際化侦另、校驗(yàn)和調(diào)度功能秩命。

????? ? Spring AOP:通過配置管理特性尉共,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以弃锐,可以很容易地使 Spring 框架管理的任何對象支持 AOP袄友。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP霹菊,不用依賴 EJB 組件剧蚣,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。

????? ? Spring DAO:JDBC DAO抽象層提供了有意義的異常層次結(jié)構(gòu)浇辜,可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯誤消息券敌。異常層次結(jié)構(gòu)簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)柳洋。Spring DAO的面向JDBC的異常遵從通用的DAO異常層次結(jié)構(gòu)待诅。

????? ? Spring ORM: Spring框架插入了若干個ORM框架,從而提供了ORM的對象關(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 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>

????? ? Spring MVC 框架:MVC 框架是一個全功能的構(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)境之間重用胰耗。

1.2 IOC 和 AOP

??? 控制反轉(zhuǎn)模式(也稱作依賴性介入)的基本概念是:不創(chuàng)建對象,但是描述創(chuàng)建它們的方式芒涡。在代碼中不直接與對象和服務(wù)連接柴灯,但在配置文件中描述哪一個組件需要哪一項服務(wù)。容器(在 Spring 框架中是 IOC 容器)負(fù)責(zé)將這些聯(lián)系在一起费尽。

??? 在典型的 IOC 場景中赠群,容器創(chuàng)建了所有對象,并設(shè)置必要的屬性將它們連接在一起旱幼,決定什么時間調(diào)用方法查描。下表列出了 IOC 的一個實(shí)現(xiàn)模式。

Spring框架的 IOC 容器采用類型 2 和類型3實(shí)現(xiàn)柏卤。

1.2.1 面向切方的編程

??? 面向切面的編程冬三,即AOP,是一種編程技術(shù)缘缚,它允許程序員對橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線的行為(例如日志和事務(wù)管理)進(jìn)行模塊化勾笆。AOP的核心構(gòu)造是切面,它將那些影響多個類的行為封裝到可重用的模塊中桥滨。

??? 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ù)管理泣特、日志和其他各種特性的上下文中。

1.3 IOC容器

??? Spring設(shè)計的核心是?org.springframework.beans?包挑随,它的設(shè)計目標(biāo)是與 JavaBean 組件一起使用状您。這個包通常不是由用戶直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介兜挨。下一個最高級抽象是??BeanFactory?接口膏孟,它是工廠設(shè)計模式的實(shí)現(xiàn),允許通過名稱創(chuàng)建和檢索對象拌汇。BeanFactory?也可以管理對象之間的關(guān)系柒桑。

??? BeanFactory?支持兩個對象模型。

·???????單例?模型提供了具有特定名稱的對象的共享實(shí)例噪舀,可以在查詢時對其進(jìn)行檢索魁淳。Singleton 是默認(rèn)的也是最常用的對象模型飘诗。對于無狀態(tài)服務(wù)對象很理想。

·???????原型?模型確保每次檢索都會創(chuàng)建單獨(dú)的對象界逛。在每個用戶都需要自己的對象時昆稿,原型模型最適合。

??? bean工廠的概念是Spring作為IOC容器的基礎(chǔ)息拜。IOC將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架溉潭。正如我將在下一個示例中演示的那樣,Spring框架使用JavaBean屬性和配置數(shù)據(jù)來指出必須設(shè)置的依賴關(guān)系少欺。

1.3.1 BeanFactory 接口

??? 因?yàn)?org.springframework.beans.factory.BeanFactory?是一個簡單接口喳瓣,所以可以針對各種底層存儲方法實(shí)現(xiàn)。最常用的?BeanFactory?定義是?XmlBeanFactory赞别,它根據(jù) XML 文件中的定義裝入 bean畏陕,如清單1所示。

??? 清單1.XmlBeanFactory

????BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));

????在XML文件中定義的Bean是被懶加載的氯庆,這意味在需要bean之前蹭秋,bean本身不會被初始化。要從BeanFactory檢索bean堤撵,只需調(diào)用getBean()方法仁讨,傳入將要檢索的 bean 的名稱即可,如清單2所示实昨。

??? 清單2.getBean()

????MyBean mybean = (MyBean) factory.getBean("mybean");

??? 每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義)或?FactoryBean洞豁。FactoryBean?接口為使用 Spring 框架構(gòu)建的應(yīng)用程序添加了一個間接的級別。

1.4 IOC示例

??? 理解控制反轉(zhuǎn)最簡單的方式就是看它的實(shí)際應(yīng)用荒给。在對由三部分組成的?Spring 系列?的第 1 部分進(jìn)行總結(jié)時丈挟,我使用了一個示例,演示了如何通過 Spring IOC容器注入應(yīng)用程序的依賴關(guān)系(而不是將它們構(gòu)建進(jìn)來)志电。

??? 我用開啟在線信用帳戶的用例作為起點(diǎn)曙咽。對于該實(shí)現(xiàn),開啟信用帳戶要求用戶與以下服務(wù)進(jìn)行交互:

· ? ? ? 信用級別評定服務(wù)挑辆,查詢用戶的信用歷史信息例朱。

· ? ? ?遠(yuǎn)程信息鏈接服務(wù),插入客戶信息鱼蝉,將客戶信息與信用卡和銀行信息連接起來洒嗤,以進(jìn)行自動借記(如果需要的話)。

· ? ? 電子郵件服務(wù)魁亦,向用戶發(fā)送有關(guān)信用卡狀態(tài)的電子郵件渔隶。

1.5 ?三個接口

??? 對于這個示例,我假設(shè)服務(wù)已經(jīng)存在洁奈,理想的情況是用松散耦合的方式把它們集成在一起间唉。以下清單顯示了三個服務(wù)的應(yīng)用程序接口绞灼。

??? 清單3. CreditRatingInterface

public interface CreditRatingInterface {

???public boolean getUserCreditHistoryInformation(ICustomer iCustomer);

}

??? 清單 3 所示的信用級別評定接口提供了信用歷史信息。它需要一個包含客戶信息的?Customer?對象呈野。該接口的實(shí)現(xiàn)是由?CreditRating?類提供的镀赌。

??? 清單4.CreditLinkingInterface

public interface CreditLinkingInterface {

????????public ?String getUrl();

????????public ?void setUrl(String url);

????????public ?void linkCreditBankAccount() throws Exception ;

}

????信用鏈接接口將信用歷史信息與銀行信息(如果需要的話)連接在一起,并插入用戶的信用卡信息际跪。信用鏈接接口是一個遠(yuǎn)程服務(wù),它的查詢是通過?getUrl()?方法進(jìn)行的喉钢。URL 由 Spring 框架的 bean 配置機(jī)制設(shè)置姆打,我稍后會討論它。該接口的實(shí)現(xiàn)是由?CreditLinking?類提供的肠虽。

??? 清單5.EmailInterface

public ?interface EmailInterface {

??????public ?void sendEmail(ICustomer iCustomer);

??????public ?String getFromEmail();

??????public ?void setFromEmail(String fromEmail) ;

??????public String getPassword();

??????public ?void setPassword(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?類提供了該接口的實(shí)現(xiàn)。

1.6 ?Spring 使其保持松散

??? 這些接口就位之后韩玩,接下來要考慮的就是如何用松散耦合方式將它們集成在一起垒玲。在?清單 6?中可以看到信用卡帳戶用例的實(shí)現(xiàn)。

??? 注意找颓,所有的 setter 方法都是由 Spring 的配置 bean 實(shí)現(xiàn)的合愈。所有的依賴關(guān)系(也就是三個接口)都可以由 Spring 框架用這些 bean 注入。createCreditCardAccount()?方法會用服務(wù)去執(zhí)行其余實(shí)現(xiàn)击狮。在?清單 7?中可以看到 Spring 的配置文件佛析。我用箭頭突出了這些定義。?

1.7 ? 運(yùn)行應(yīng)用程序

??? 要運(yùn)行示例應(yīng)用程序彪蓬,首先必須?下載 Spring 框架?及其所有依賴文件寸莫。接下來,將框架釋放到(比如說)磁盤?c:\档冬,這會創(chuàng)建?C:\spring-framework-1.2-rc2?(適用于當(dāng)前發(fā)行版本) 這樣的文件夾膘茎。在繼續(xù)后面的操作之前,還必須下載和釋放?Apache Ant捣郊。

? ??接下來辽狈,將源代碼釋放到文件夾,例如?c:\?盤呛牲,然后創(chuàng)建?SpringProject刮萌。將 Spring 庫(即?C:\spring-framework-1.2-rc2\dist下的?spring.jar?和?C:\spring-framework-1.2-rc2\lib\jakarta-commons?下的??commons-logging.jar)復(fù)制到?SpringProject\lib?文件夾中。完成這些工作之后娘扩,就有了必需的構(gòu)建依賴關(guān)系集着茸。

??? 打開命令提示符壮锻,將當(dāng)前目錄切換到?SpringProject,在命令提示符中輸入以下命令:build涮阔。?

??? 這會構(gòu)建并運(yùn)行?CreateCreditAccountClient?類猜绣,類的運(yùn)行將創(chuàng)建?Customer?類對象并填充它,還會調(diào)用?CreateCreditCardAccount?類創(chuàng)建并鏈接信用卡帳戶敬特。CreateCreditAccountClient?還會通過?ClassPathXmlApplicationContext?裝入 Spring 配置文件掰邢。裝入 bean 之后,就可以通過?getBean()?方法訪問它們了伟阔,如清單 8 所示辣之。

??? 清單 8. 裝入 Spring 配置文件

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {

?????"springexample-creditaccount.xml"

?});

CreateCreditCardAccountInterface ?creditCardAccount = (CreateCreditCardAccountInterface)

????appContext.getBean("createCreditCard");

1.8 結(jié)束語

??? 在這篇由三部分組成的?Spring 系列?的第一篇文章中,我介紹了 Spring 框架的基礎(chǔ)皱炉。我從討論組成 Spring 分層架構(gòu)的 7 個模塊開始怀估,然后深入介紹了其中兩個模塊:Spring AOP 和 IOC 容器。

??? 由于學(xué)習(xí)的最佳方法是實(shí)踐合搅,所以我用一個工作示例介紹了 IOC 模式(像 Spring 的 IOC 容器實(shí)現(xiàn)的那樣)如何用松散耦合的方式將分散的系統(tǒng)集成在一起多搀。在這個示例中可以看到,將依賴關(guān)系或服務(wù)注入工作中的信用卡帳戶應(yīng)用程序灾部,要比從頭開始構(gòu)建它們?nèi)菀椎枚唷?/p>

??? 請繼續(xù)關(guān)注這一系列的下一篇文章康铭,我將在這里學(xué)習(xí)的知識基礎(chǔ)上,介紹 Spring AOP模塊如何在企業(yè)應(yīng)用程序中提供持久支持梳猪,并讓您開始了解 Spring MVC 模塊和相關(guān)插件麻削。

2 Spring AOP與Hibernate

2.1 ?Spring AOP

??? 軟件系統(tǒng)通常由多個組件構(gòu)成,每個組件負(fù)責(zé)一個特定的功能領(lǐng)域春弥。但是呛哟,這些組件也經(jīng)常承擔(dān)它們的核心功能之外的額外責(zé)任。系統(tǒng)服務(wù)(例如日志匿沛、事務(wù)管理和安全性)經(jīng)常發(fā)現(xiàn)自己跑到了別的組件的領(lǐng)域里扫责,而這些組件的核心職責(zé)是其他事情。結(jié)果就是所謂的“代碼糾纏”逃呼,或者更簡單點(diǎn)兒說“一團(tuán)糟”鳖孤。面向方面編程是一種試圖解決這個問題的編程技術(shù),它把關(guān)注點(diǎn)的隔離提升為核心的編程概念抡笼。

??? 使用 AOP 時苏揣,仍然是在一個地方定義系統(tǒng)的公共功能,但是可以聲明性地定義?如何?和?在哪里?應(yīng)用這個功能推姻。如果對橫切關(guān)注點(diǎn)(例如日志和事務(wù)管理)進(jìn)行了模塊化平匈,那么不用修改每個單獨(dú)的類,就可以向代碼中添加新特性。這類模塊化的關(guān)注點(diǎn)稱作?方面增炭。

??? 以一個企業(yè)應(yīng)用程序?yàn)槔淘铩_@類應(yīng)用程序通常要求類似于安全性和事務(wù)支持的服務(wù)。顯然隙姿,可以把這些服務(wù)的支持直接編寫到要求服務(wù)的每個類當(dāng)中梅垄,但是更希望能夠不必為大量事務(wù)性上下文編寫同樣的事務(wù)處理代碼。如果使用 Spring AOP進(jìn)行事務(wù)處理输玷,那么可以聲明性地安排適當(dāng)?shù)姆椒ㄕ{(diào)用队丝,而不必逐個安排。

??? Spring AOP提供了幾個方面欲鹏,可以為 JavaBean 聲明事務(wù)炭玫。例如,TransactionProxyFactoryBean?是個方便的代理類貌虾,能夠攔截對現(xiàn)有類的方法調(diào)用,并把事務(wù)上下文應(yīng)用到事務(wù) bean裙犹。在下面的示例中會看到這個類的實(shí)際應(yīng)用尽狠。

2.2 ? Hibernate

??? Spring框架提供了對 Hibernate、JDO 和 iBATIS SQL

????Maps 的集成支持叶圃。Spring 對 Hibernate 的支持是第一級的袄膏,整合了許多 IOC 的方便特性,解決了許多典型的 Hibernate 集成問題掺冠〕凉荩框架對 Hibernate 的支持符合 Spring 通用的事務(wù)和數(shù)據(jù)訪問對象(DAO)異常層次結(jié)構(gòu)。

??? Spring為使用選擇的 OR 映射層來創(chuàng)建數(shù)據(jù)訪問應(yīng)用程序提供了支持德崭。因?yàn)樗袞|西都設(shè)計成一組可重用 JavaBean斥黑,所以不管選擇什么技術(shù),都能以庫的格式訪問大多數(shù) Spring 的 OR 映射支持眉厨。?ApplicationContext?或?BeanFactory?內(nèi)部的 OR 映射的好處是簡化了配置和部署锌奴。

??? Hibernate是 Java 平臺上一個功能全面的、開源的 OR 映射框架憾股。Hibernate 支持開發(fā)符合常規(guī) Java 理念的持久性類 —— 包括關(guān)聯(lián)鹿蜀、繼承、多態(tài)服球、復(fù)合以及 Java 集合框架茴恰。Hibernate 查詢語言(HQL)被設(shè)計成 SQL 的一個微型面向?qū)ο髷U(kuò)展,它是對象和關(guān)系世界之間的橋梁斩熊。Hibernate 也支持用原始 SQL 或基于 Java 的標(biāo)準(zhǔn)和示例查詢表達(dá)查詢往枣。Hibernate 使用 XML(*.hbm.xml)文件把 Java 類映射到表,把 JavaBean 屬性映射到數(shù)據(jù)庫表。

??? 通過 JDBC 技術(shù)婉商,支持所有的 SQL 數(shù)據(jù)庫管理系統(tǒng)似忧。Hibernate 與所有流行的 J2EE 應(yīng)用程序服務(wù)器和 Web 容器都很好地集成。

2.3 ? 實(shí)際示例

??? 一個銀行應(yīng)用程序示例可以讓您自己看到 Spring AOP和 Hibernate 一起工作有多么好丈秩。銀行帳戶用例允許用戶 (Customer)在一個事務(wù)中打開一個或多個銀行帳戶盯捌。用戶可以申請多個銀行帳戶,可以選擇是支票帳戶類型或者是儲蓄帳戶類型蘑秽。

??? 應(yīng)用程序數(shù)據(jù)庫(Cloudscape?)容納所有客戶和帳戶信息饺著。在這個例子中,假設(shè)在?Customer?和?Account?類之間存在?1:N?的關(guān)聯(lián)肠牲。在實(shí)際生活場景中幼衰,關(guān)聯(lián)可能需要按?m:n?建模,才能支持聯(lián)合帳戶缀雳。

??? 由于用戶必須可以在一個事務(wù)中申請多個帳戶渡嚣,所以首先要為數(shù)據(jù)庫交互實(shí)現(xiàn)一個 DOA 模式。然后要設(shè)置 Spring AOP的?TransactionProxyFactoryBean肥印,讓它攔截方法調(diào)用并聲明性地把事務(wù)上下文應(yīng)用到 DOA识椰。

2.4 ? Hibernate實(shí)踐

??? 在Spring框架中,像JDBC?DataSource或Hibernate?SessionFactory這樣的資源深碱,在應(yīng)用程序上下文中可以用bean實(shí)現(xiàn)腹鹉。需要訪問資源的應(yīng)用程序?qū)ο笾恍柰ㄟ^bean引用得到這類預(yù)先定義好的實(shí)例的引用即可(這方面的更多內(nèi)容在?下一節(jié)中)。在清單1中敷硅,可以看到示例銀行應(yīng)用程序的一段摘錄:XML 應(yīng)用程序上下文定義顯示了如何設(shè)置JDBC?DataSource功咒,并在上面放一個Hibernate?SessionFactory。

??? 清單1.JDBC DataSource 和 HibernateSessionFactory 連接

??? 清單 1?顯示了如何為示例應(yīng)用程序數(shù)據(jù)庫(是 Cloudscape)配置數(shù)據(jù)源 bean(exampleDataSource)绞蹦。exampleDatasource被連接到 Spring Hibernate 的?SessionFactory力奋。請注意?*.hbm.xml?指定了示例應(yīng)用程序的OR映射文件。?

??? 數(shù)據(jù)源和會話工廠設(shè)置好之后幽七,下一步就是在DAO中連接刊侯,在?CustomerDAOImpl?示例中,要使用?SessionFactory锉走。接下來滨彻,插入Spring的TransactionProxyFactoryBean,它會攔截對應(yīng)用程序的CustomerDAOImpl對象的方法調(diào)用挪蹭,并聲明性地在它上面應(yīng)用事務(wù)亭饵。

??? 在?清單 2?的這個示例中,CustomerDAOImpl?類的addCustomer?方法是作為事務(wù)的一部分執(zhí)行的梁厉,有一個事務(wù)屬性?PROPAGATION_REQUIRED辜羊。這個屬性等價于 EJB 容器的?TX_REQUIRED踏兜。如果想讓這個方法一直在事務(wù)中運(yùn)行,可以使用?PROPAGATION_REQUIRED八秃。如果事務(wù)已經(jīng)在運(yùn)行碱妆,那么 bean 方法會加入事務(wù),否則 Spring 的輕量級事務(wù)管理器會啟動一個事務(wù)昔驱。如果想在調(diào)用組件服務(wù)時總是啟動新事務(wù)疹尾,可以使用?PROPAGATION_REQUIRES_NEW?屬性。

??? 應(yīng)用程序的連接完成之后骤肛,現(xiàn)在來進(jìn)一步查看源代碼纳本。

2.5 ? 分析這個!

??? 如果以前沒這么做過,那么請?下載這篇文章的源代碼腋颠。把源 zip 文件釋放到計算機(jī)中的任何位置上繁成,例如?c:\。會創(chuàng)建一個叫作?SpringProjectPart2?的文件夾淑玫。src\spring?文件夾包含示例應(yīng)用程序的 Hibernate 映射文件和 Spring 配置文件巾腕。src\springexample\hibernate?文件包含應(yīng)用程序的源代碼。

??? 在這里會發(fā)現(xiàn)兩個類絮蒿,即?Customer?和??Account祠墅,它們用 Hibernate 映射文件映射到兩個表。Customer?類代表客戶信息歌径,Account?代表客戶的帳戶信息。正如前面提到的亲茅,我把這兩個類按照?1: N?關(guān)系進(jìn)行建模回铛,即一個?Customer?可以擁有多個?Account。清單3顯示了?Customer?對象的 Hibernate 映射文件克锣。

??? 清單 3. Customer 對象的 Hibernate 映射文件

??? set name="accounts"?和一對多類標(biāo)簽指定了?Customer?和?Account?之間的關(guān)系茵肃。我還在?Account.hbm.xml?文件中定義了?Account?對象的映射。

??? CustomerDAOImpl.java?代表應(yīng)用程序的 DAO袭祟,它在應(yīng)用程序數(shù)據(jù)庫中插入客戶和帳戶信息验残。CustomerDAOImpl?擴(kuò)展了 Spring 的?HibernateDaoSupport,它用 Spring

????HibernateTemplate 簡化了會話管理巾乳。這樣您没,可以通過?getHibernateTemplate()?方法保存或檢索數(shù)據(jù)。下面顯示的?getCustomerAccountInfo()?對?Customer?進(jìn)行?查找胆绊,通過getHibernateTemplate().find方法用 HQL 得到客戶的帳戶信息氨鹏,如清單 4 所示。

??? 清單 4. DAO 實(shí)現(xiàn)

public ?class CustomerDAOImpl extends HibernateDaoSupport implements CustomerDAO{

??????public void addCustomer(Customer customer) {

????????????getHibernateTemplate().save(customer);????

????????????//TODO Auto-generated method stub

??????}

??????public Customer getCustomerAccountInfo(Customer customer) {

????????Customer cust = null;

????????List list = getHibernateTemplate().find("from Customer customer " +

??????????"where customer.userId = ?" , customer.getUserId(),Hibernate.STRING);

????????if(list.size() > 0){

??????????cust = (Customer)? list.get(0);

????????}

????????return ?cust;

??}

??? 所有這些都應(yīng)當(dāng)很容易掌握⊙棺矗現(xiàn)在來看代碼的實(shí)際應(yīng)用!

2.6 ?運(yùn)行應(yīng)用程序

??? 要運(yùn)行示例應(yīng)用程序仆抵,必須首先?下載 Spring 框架?和它的全部依賴文件。接下來,釋放框架到某一位置(比如?c:\?)镣丑,這會創(chuàng)建文件夾?C:\spring-framework-1.2-rc2(針對當(dāng)前發(fā)行版)舔糖。在繼續(xù)之前還必須下載和釋放?Apache Ant?和?Cloudscape。下載 Cloudscape之后莺匠,把它釋放到?c:\?金吗,這會創(chuàng)建文件夾?C:\Cloudscape_10.0

??? 接下來慨蛙,釋放源代碼到?c:\?辽聊,這會創(chuàng)建?SpringProject2?文件夾。接下來修改?build.xml?文件的入口期贫,用實(shí)際安裝 Spring 的位置代替?C:\spring-framework-1.2-rc2跟匆,用實(shí)際安裝 Cloudscape的位置代替?C:\Program?Files\IBM\Cloudscape_10.0。

??? 打開命令行提示符通砍,進(jìn)入?SpringProject?目錄玛臂,在命令行提示符下輸入以下命令:build.?

????這會構(gòu)建并運(yùn)行?CreateBankCustomerClient?類,它會創(chuàng)建?Customer?類對象封孙,用數(shù)據(jù)填充它迹冤,創(chuàng)建?Account?對象,填充它虎忌,并把它添加到?Customer?對象泡徙。

??? 然后?CreateBankCustomerClient?會調(diào)用?CustomerDAOImpl.addCustomer?類,添加客戶和帳戶信息膜蠢。一旦插入完成堪藐,CreateBankCustomerClient?會調(diào)用CustomerDAOImpl.getCustomerAccountInfo?方法,根據(jù)?userid?得到客戶和帳戶信息挑围。如果?CreateBankCustomerClient?執(zhí)行成功礁竞,會在控制臺上看到打印出?userid。也可以查詢 Cloudscape數(shù)據(jù)庫檢索客戶和帳戶信息杉辙。?

2.7 ?結(jié)束語

??? 在三部分的?Spring 系列?的第 2 部分中模捂,我介紹了如何集成 Spring?Hibernate和Spring AOP。結(jié)果是一個強(qiáng)健的持久性框架蜘矢,支持聲明性的實(shí)現(xiàn)事務(wù)狂男。

??? 在這個系列的下一篇,也是最后一篇文章中品腹,我將介紹 Spring 的 MVC 模塊并淋,介紹如何用它來簡化基于 Web 的應(yīng)用程序的創(chuàng)建。

3 Spring MVC框架

3.1 Spring MVC框架

??? Spring框架提供了構(gòu)建 Web 應(yīng)用程序的全功能 MVC 模塊珍昨。使用 Spring 可插入的 MVC 架構(gòu)县耽,可以選擇是使用內(nèi)置的 Spring Web 框架還是 Struts 這樣的 Web 框架句喷。通過策略接口,Spring 框架是高度可配置的兔毙,而且包含多種視圖技術(shù)唾琼,例如 JavaServer Pages(JSP)技術(shù)、Velocity澎剥、Tiles锡溯、iText 和 POI。Spring MVC 框架并不知道使用的視圖哑姚,所以不會強(qiáng)迫您只使用 JSP 技術(shù)祭饭。Spring MVC 分離了控制器、模型對象叙量、分派器以及處理程序?qū)ο蟮慕巧@種分離讓它們更容易進(jìn)行定制。

?? ?Spring的Web MVC框架是圍繞DispatcherServlet設(shè)計的绞佩,它把請求分派給處理程序寺鸥,同時帶有可配置的處理程序映射、視圖解析品山、本地語言胆建、主題解析以及上載文件支持。默認(rèn)的處理程序是非常簡單的 Controller 接口肘交,只有一個方法 ModelAndView handleRequest(request,response)笆载。Spring 提供了一個控制器層次結(jié)構(gòu),可以派生子類涯呻。如果應(yīng)用程序需要處理用戶輸入表單凉驻,那么可以繼承AbstractFormController。如果需要把多頁輸入處理到一個表單魄懂,那么可以繼承AbstractWizardFormController。

??? 示例應(yīng)用程序有助于直觀地學(xué)習(xí)這些特性闯第。銀行應(yīng)用程序允許用戶檢索他們的帳戶信息市栗。在構(gòu)建銀行應(yīng)用程序的過程中,可以學(xué)到如何配置 Spring MVC 框架和實(shí)現(xiàn)框架的視圖層咳短,視圖層包括 JSTL 標(biāo)記(用于顯示輸出的數(shù)據(jù))和JavaServer Pages 技術(shù)填帽。

3.2 配置Spring MVC

??? 要開始構(gòu)建示例應(yīng)用程序,請配置 Spring MVC 的 DispatcherServlet咙好。請在 web.xml 文件中注冊所有配置篡腌。清單1顯示了如何配置 sampleBankingServlet。

??? 清單1. 配置Spring MVC DispatcherServlet

??? DispatcherServlet從一個XML文件裝入Spring應(yīng)用程序上下文勾效,XML文件的名稱是servlet 的名稱后面加上-servlet 嘹悼。在這個示例中叛甫,DispatcherServlet 會從 sampleBankingServlet-servlet.xml 文件裝入應(yīng)用程序上下文。

3.3 配置應(yīng)用程序的URL

??? 下一步是配置想讓sampleBankingServlet處理的URL杨伙。同樣其监,還是要在web.xml中注冊所有這些信息。

??? 清單 2. 配置想要處理的URL

3.4 裝入配置文件

??? 下面限匣,裝入配置文件抖苦。為了做到這點(diǎn),請為 Servlet 2.3 規(guī)范注冊 ContextLoaderListener 或?yàn)?Servlet 2.2 及以下的容器注冊 ContextLoaderServlet米死。為了保障后向兼容性锌历,請用ContextLoaderServlet。在啟動 Web 應(yīng)用程序時峦筒,ContextLoaderServlet 會裝入 Spring 配置文件究西。清單3注冊了 ContextLoaderServlet。

??? 清單 3. 注冊 ContextLoaderServlet

??? contextConfigLocation參數(shù)定義了要裝入的 Spring 配置文件勘天,如下面的 servlet 上下文所示怔揩。

??? sampleBanking-services.xml 文件代表示例銀行應(yīng)用程序服務(wù)的配置和 bean 配置。如果想裝入多個配置文件脯丝,可以在 標(biāo)記中用逗號作分隔符商膊。

3.5 Spring MVC示例

??? 示例銀行應(yīng)用程序允許用戶根據(jù)惟一的 ID 和口令查看帳戶信息。雖然 Spring MVC 提供了其他選項宠进,但是我將采用 JSP 技術(shù)作為視圖頁面晕拆。這個簡單的應(yīng)用程序包含一個視圖頁用于用戶輸入(ID 和口令),另一頁顯示用戶的帳戶信息材蹬。

??? 我從 LoginBankController 開始实幕,它擴(kuò)展了 Spring MVC 的 SimpleFormController。SimpleFormContoller 提供了顯示從 HTTP GET 請求接收到的表單的功能堤器,以及處理從 HTTP POST 接收到的相同表單數(shù)據(jù)的功能昆庇。LoginBankController 用 AuthenticationService 和 AccountServices 服務(wù)進(jìn)行驗(yàn)證,并執(zhí)行帳戶活動闸溃≌海“ 配置視圖屬性 ”一節(jié)中的 清單 5 描述了如何把 AuthenticationService 和 AccountServices 連接到 LoginBankController。 清單 4顯示了 LoginBankController 的代碼辉川。

3.6 配置視圖屬性

??? 下面表蝙,我必須注冊在接收到 HTTP GET 請求時顯示的頁面。我在 Spring 配置中用 formView 屬性注冊這個頁面乓旗,如清單 5 所示府蛇。sucessView 屬性代表表單數(shù)據(jù)提交而且 doSubmitAction() 方法中的邏輯成功執(zhí)行之后顯示的頁面。formView 和 sucessView 屬性都代表被定義的視圖的邏輯名稱屿愚,邏輯名稱映射到實(shí)際的視圖頁面汇跨。

??? 清單 5. 注冊 LoginBankController

??? commandClass和 commandName 標(biāo)記決定將在視圖頁面中活動的 bean务荆。例如,可以通過 login.jsp 頁面訪問 loginCommand bean扰法,這個頁面是應(yīng)用程序的登錄頁面蛹含。一旦用戶提交了登錄頁面,應(yīng)用程序就可以從 LoginBankController 的 onSubmit() 方法中的命令對象檢索出表單數(shù)據(jù)塞颁。

3.7 視圖解析器

??? Spring MVC的 視圖解析器 把每個邏輯名稱解析成實(shí)際的資源浦箱,即包含帳戶信息的 JSP 文件诵棵。我用的是 Spring 的 InternalResourceViewResolver迫横,如 清單 6所示。

??? 因?yàn)槲以?JSP 頁面中使用了 JSTL 標(biāo)記耕捞,所以用戶的登錄名稱解析成資源 /jsp/login.jsp伴网,而 viewClass 成為 JstlView蓬推。

3.8 驗(yàn)證和帳戶服務(wù)

??? 就像前面提到的,LoginBankController 內(nèi)部連接了 Spring 的 AccountServices 和 AuthenticationService澡腾。AuthenticationService 類處理銀行應(yīng)用程序的驗(yàn)證沸伏。AccountServices 類處理典型的銀行服務(wù),例如查找交易和電匯动分。清單 7 顯示了銀行應(yīng)用程序的驗(yàn)證和帳戶服務(wù)的配置毅糟。

??? 清單 7. 配置驗(yàn)證和帳戶服務(wù)

????以上服務(wù)在 sampleBanking-services.xml 中注冊,然后裝入 web.xml 文件中澜公,就像 前面討論的那樣姆另。控制器和服務(wù)配置好后坟乾,這個簡單的應(yīng)用程序就完成了〖7現(xiàn)在我們來看看部署和測試它時會發(fā)生什么!

3.9 部署應(yīng)用程序

??? 我把示例應(yīng)用程序部署在 Tomcat servlet 容器中。Tomcat 是 Java Servlet 和 Java ServerPagest 技術(shù)的官方參考實(shí)現(xiàn)中使用的 servlet 容器甚侣。如果以前沒這么做過明吩,請 下載 jakarta-tomcat-5.0.28.exe并運(yùn)行它把 Tomcat 安裝到自己喜歡的任何位置,例如 c:\tomcat5.0殷费。

??? 接下來印荔,下載示例代碼 并釋放到驅(qū)動器(例如 c:\ )上。創(chuàng)建了 Spring 項目的文件夾之后宗兼,打開它并把 spring-banking 子文件夾拷貝到 c:\tomvat5.0\webapps躏鱼。spring-banking 文件夾是一個 Web 檔案氮采,里面包含 Spring MVC 示例應(yīng)用程序殷绍。lib 文件夾包含應(yīng)用程序需要的 Spring 框架、與Spring 相關(guān)的 MVC 庫以及 JSTL 標(biāo)記庫和 jar 文件鹊漠。

????要啟動 Tomcat 服務(wù)器主到,請使用以下命令:

??? cd bin C:\Tomcat 5.0\bin>catalina.bat start

??? Tomcat應(yīng)當(dāng)啟動并部署 Spring MVC 示例應(yīng)用程序茶行。

3.10 ?測試應(yīng)用程序

??? 要測試應(yīng)用程序,請打開 Web 瀏覽器登钥,指向http://localhost:tomcatport/springbanking并用 Tomcat 服務(wù)器實(shí)際運(yùn)行的端口替換 tomcatport畔师。應(yīng)當(dāng)看到圖 1 所示的登錄屏幕。輸入用戶 ID “admin”和口令“password”牧牢,并按下登錄按鈕看锉。其他用戶 ID 或口令會造成來自驗(yàn)證服務(wù)的錯誤。

??? 圖 1. Spring MVC 示例登錄屏幕

登錄成功之后塔鳍,會看到圖 2 所示的帳戶細(xì)節(jié)頁面伯铣。

圖 2. Spring MVC 示例帳戶細(xì)節(jié)頁面

3.11 ?結(jié)束語

??? 在三部分的 Spring 系列的第三篇文章中,我介紹了 Spring MVC 框架的特性轮纫。我演示了如何配置和開發(fā) Spring MVC 應(yīng)用程序腔寡、如何配置 Spring MVC 控制器和向其中插入依賴項、如何用 JavaServer Pages 技術(shù)開發(fā)應(yīng)用程序視圖掌唾,以及如何把自己的頁面與 Spring MVC 的視圖層集成放前。總結(jié)這篇文章時糯彬,我演示了如何在 Tomcat servlet 容器中部署應(yīng)用程序以及如何在瀏覽器中測試它凭语。

??? 請繼續(xù)關(guān)注 Spring 系列 的下一篇文章。在下一篇文章中情连,我將介紹如何把基于 JMS 的應(yīng)用程序與 Spring 框架集成叽粹。同時,請參閱 參考資料 學(xué)習(xí)更多有關(guān) Spring 框架和 Spring MVC 的內(nèi)容却舀。

4 ?參考鏈接

Spring框架簡介

https://www.ibm.com/developerworks/cn/java/wa-spring1/

當(dāng)Hibernate遇上Spring

https://www.ibm.com/developerworks/cn/java/wa-spring2/index.html?ca=drs-

Spring(一)——總體介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虫几,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挽拔,更是在濱河造成了極大的恐慌辆脸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螃诅,死亡現(xiàn)場離奇詭異啡氢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)术裸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門倘是,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袭艺,你說我怎么就攤上這事搀崭。” “怎么了猾编?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵瘤睹,是天一觀的道長升敲。 經(jīng)常有香客問我,道長轰传,這世上最難降的妖魔是什么驴党? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮获茬,結(jié)果婚禮上港庄,老公的妹妹穿的比我還像新娘。我一直安慰自己恕曲,他們只是感情好攘轩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著码俩,像睡著了一般度帮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稿存,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天笨篷,我揣著相機(jī)與錄音,去河邊找鬼瓣履。 笑死率翅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袖迎。 我是一名探鬼主播冕臭,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燕锥!你這毒婦竟也來了辜贵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤归形,失蹤者是張志新(化名)和其女友劉穎托慨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇榴,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厚棵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔼紧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婆硬。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奸例,靈堂內(nèi)的尸體忽然破棺而出彬犯,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布躏嚎,位于F島的核電站,受9級特大地震影響菩貌,放射性物質(zhì)發(fā)生泄漏卢佣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一箭阶、第九天 我趴在偏房一處隱蔽的房頂上張望虚茶。 院中可真熱鬧,春花似錦仇参、人聲如沸嘹叫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩扇。三九已至,卻和暖如春怕磨,著一層夾襖步出監(jiān)牢的瞬間喂饥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工肠鲫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留员帮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓导饲,卻偏偏與公主長得像捞高,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渣锦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理硝岗,服務(wù)發(fā)現(xiàn),斷路器袋毙,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • (一)Struts月幌、Spring、Hibernate悬蔽、Mybatis框技術(shù) 1.Struts2.0有幾種標(biāo)簽庫 【...
    獨(dú)云閱讀 3,226評論 0 62
  • 電影講述了卡特教練接手擔(dān)任一所高中的籃球教練,但是整個隊伍卻一塌糊涂录语”渡叮卡特教練通過一番努力不但讓高中生們找到了自我...
    娟娟Fanny閱讀 552評論 0 1
  • 2017年9月19日 昨夜的夢虽缕,高中老胡,愿你這輩子蒲稳,活的久一點(diǎn)氮趋。 夢里,我并不知道在夢里江耀。 站在教室里剩胁,我知道...
    籬笆蕊閱讀 192評論 0 0