?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
目錄
Java應(yīng)用(從applets的小范圍到全套n層服務(wù)端企業(yè)應(yīng)用)是一種典型的依賴型應(yīng)用,它就是由一些互相適當(dāng)?shù)貐f(xié)作的對象構(gòu)成的。因此,我們說這些對象間存在依賴關(guān)系。
Java語言和java平臺在架構(gòu)應(yīng)用與建立應(yīng)用方面,提供著豐富的功能。從非?;A(chǔ)的基本數(shù)據(jù)類型和Class(即定義新類)組成的程序塊,到建立具有豐富的特性的應(yīng)用服務(wù)器和web框架都有著很多的方法。一方面,可以通過抽象的顯著特性讓基礎(chǔ)的程序塊組成在一起成為一個連貫的整體。這樣,構(gòu)建一個應(yīng)用(或者多個應(yīng)用)的工作就可以交給架構(gòu)師或者開發(fā)人員去做。因此,我們就可以清晰的知道哪些業(yè)務(wù)需要哪些Classes和對象組成,哪些設(shè)計(jì)模式可以應(yīng)用在哪些業(yè)務(wù)上面。 例如:Factory、Abstract Factory、Builder、Decorator 和 Service Locator 這些模式(列舉的只是少數(shù))在軟件開發(fā)行業(yè)被普遍認(rèn)可和肯定(或許這就是為什么這些模式被定型的原因)。 這固然是件好事,不過這些模式只是一個有名字的,有說明的,知道最好用在什么地方的,解決應(yīng)用中什么問題的最佳實(shí)踐而已。 在本章節(jié)的最后,用“... 說明 ...”給出了模式說明。 通常,模式書籍與wikis通常都列出了你可以獲得的最佳實(shí)踐,不過,希望你思考之后,在你自己的應(yīng)用中 實(shí)現(xiàn)自己的模式。
Spring的IoC控件主要專注于如何利用classes、對象和服務(wù)去組成一個企業(yè)級應(yīng)用,通過規(guī)范的方式,將各種不同的控件整合成一個完整的應(yīng)用。Spring中使用了很多被實(shí)踐證明的最佳實(shí)踐和正規(guī)的設(shè)計(jì)模式,并且進(jìn)行了編碼實(shí)現(xiàn)。如果你是一個,構(gòu)架師或者開發(fā)人員完全可以取出它們集成到你自己的應(yīng)用之中。這對于那些使用了Spring Framework的組織和機(jī)構(gòu)來說,在spring基礎(chǔ)上實(shí)現(xiàn)應(yīng)用不僅可以構(gòu)建優(yōu)秀的,可維護(hù)的應(yīng)用并對Spring的設(shè)計(jì)進(jìn)行驗(yàn)證,確實(shí)是一件好事情。
Spring框架包含許多特性,并被很好地組織在下圖所示的六個模塊中。本節(jié)將依次介紹每個模塊。
Spring框架概述
Core 封裝包是框架的最基礎(chǔ)部分,提供IoC和依賴注入特性。這里的基礎(chǔ)概念是BeanFactory
,它提供對Factory模式的經(jīng)典實(shí)現(xiàn)來消除對程序性單例模式的需要,并真正地允許你從程序邏輯中分離出依賴關(guān)系和配置。
Context(上下文) 封裝包構(gòu)筑于Core封裝包的堅(jiān)固基礎(chǔ)上:它提供了用一種框架風(fēng)格的方式來訪問對象,有些像JNDI注冊表。Context封裝包繼承了beans包的功能,還增加了國際化(I18N)(用于規(guī)范resource bundle),事件傳播,資源裝載,以及透明創(chuàng)建上下文,例如通過servlet容器。
DAO 提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數(shù)據(jù)庫廠商特有的錯誤代碼。 并且,JDBC 封裝包還提供了一種比編程性更好的聲明性事務(wù)管理方法,不僅僅是實(shí)現(xiàn)了特定接口,而且對所有的POJOs(plain old Java objects)都適用。
ORM 封裝包提供了常用的“對象/關(guān)系”映射APIs的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進(jìn)行“對象/關(guān)系”映射,如前邊提到的簡單聲明性事務(wù)管理。
Spring的 AOP 封裝包提供了符合 AOP Alliance規(guī)范的面向方面的編程(aspect-oriented programming)實(shí)現(xiàn),讓你可以定義,例如方法攔截器(method-interceptors)和切點(diǎn)(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數(shù)據(jù)功能,還可以將各種行為信息合并到你的代碼中,這有點(diǎn)象.Net的attribute的概念。
Spring中的 Web 包提供了基礎(chǔ)的針對Web開發(fā)的集成特性,例如多方文件上傳,利用Servlet listeners進(jìn)行IoC容器初始化和針對Web的application context。當(dāng)與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結(jié)合。
Spring中的 MVC 封裝包提供了Web應(yīng)用的Model-View-Controller(MVC)實(shí)現(xiàn)。Spring的MVC框架并不是僅僅提供一種傳統(tǒng)的實(shí)現(xiàn),它提供了一種 清晰的 分離模型,在領(lǐng)域模型代碼和web form之間。并且,還可以借助Spring框架的其他特性。
借助搭積木方式來解釋一下各種情景下使用Spring的情況,從簡單的Applet一直到完整的使用Spring的事務(wù)管理功能和Web框架的企業(yè)應(yīng)用。
典型的完整Spring Web應(yīng)用
通過用Spring的 聲明事務(wù)管理特性,Web應(yīng)用可以做到完全事務(wù)性,就像使用EJB提供的那種容器管理的事務(wù)一樣。
所有自定義的業(yè)務(wù)邏輯可以通過簡單的POJO來實(shí)現(xiàn),并利用Spring的IoC容器進(jìn)行管理。對于其他的服務(wù),比如發(fā)送email和不依賴web層的校驗(yàn)信息,還可以讓你自己決定在哪里執(zhí)行校驗(yàn)規(guī)則。
Spring本身的ORM支持可以和JPA、Hibernate、JDO以及iBatis集成起來,例如使用Hibernate,你可復(fù)用已經(jīng)存在的映射文件與標(biāo)準(zhǔn)的Hibernate SessionFactory
配置。用控制器去無縫整合web層和領(lǐng)域模型,消除對 ActionForms
的依賴,或者避免了其他class為領(lǐng)域模型轉(zhuǎn)換HTTP參數(shù)的需要。
使用了第三方框架的Spring中間層
有的時候,現(xiàn)有情況不允許你徹底地從一種框架切換到另一種框架。然而,Spring卻 不需要 強(qiáng)制你使用它的全部,Spring不是一種 全有全無 的解決方案。
如果,現(xiàn)有的應(yīng)用使用了WebWork、Struts、Tapestry或其他的UI框架作為前端程序,完全可以只與Spring的事務(wù)特性進(jìn)行集成。
只需要使用 ApplicationContext
來掛接你的業(yè)務(wù)邏輯和通過 WebApplicationContext
來集成你的web層前端程序。
遠(yuǎn)程使用場景
當(dāng)你需要通過WebService來訪問你的現(xiàn)有代碼時,你可使用Spring提供的 Hessian-
、Burlap-
、Rmi-
為前綴的接口或者 JaxRpcProxyFactory
這個代理類。你會發(fā)現(xiàn),遠(yuǎn)程訪問現(xiàn)有應(yīng)用程序不再那么困難了。
EJBs-包裝現(xiàn)有的POJOs
Spring還為EJB提供了 數(shù)據(jù)訪問和抽象層,讓你可以復(fù)用已存在的POJO并將他們包裝在無狀態(tài)SessionBean中,以便在可能需要聲明式安全(EJB中的安全管理,譯者注)的非安全的Web應(yīng)用中使用。