Spring(1)
一地雞毛 @ 2004-08-12 17:57
看了Rod的介紹Spring的文章,翻譯后的連接:
http://blog.csdn.net/taowen2002/archive/2004/05/07/15875.aspx
一,Spring簡介
Spring的特點:
1, Spring不同于其他的Framework,它要提供的是一種管理你的業(yè)務(wù)對象的方法。
2, Spring有分層的體系結(jié)構(gòu),意味著你能選擇僅僅使用它的任何一個獨立的部分,而其他的仍然使用你的相關(guān)實現(xiàn)。
3, 它的設(shè)計從一開始就是要幫助你編寫易于測試的代碼,Spring是使用測試驅(qū)動開發(fā)(TDD)的工程的理想框架。
4, Spring不會給你的工程添加對其他的框架依賴;同時Spring又可以稱得上是個一攬子解決方案,提供了一個典型應(yīng)用所需要的大部分基礎(chǔ)架構(gòu)。
Spring的好處:
1, Spring能有效地組織你的中間層對象;(*)
2, Spring能消除在許多工程中常見的對Singleton的過多使用;
3, 通過一種在不同應(yīng)用程序和項目間一致的方法來處理配置文件,消除各種自定義格式的屬性文件的需要,僅僅需要看看類的JavaBean屬性。Inversion of Control的使用幫助完成了這種簡化;(使用的是type2的IoC)
4, 能夠很容易培養(yǎng)你面向接口而不是面向類的編程習慣。(這也算。。。)
5, Spring的設(shè)計會讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于它的APIs,在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對象沒有依賴于Spring。
6, 使用Spring構(gòu)建的應(yīng)用程序易于單元測試;
7, Spring使EJB成為一個實現(xiàn)選擇,而不是必需的選擇。你可以用POJOs或local EJBs來實現(xiàn)業(yè)務(wù)接口,卻不會影響到調(diào)用代碼。
8, Spring提供一些web應(yīng)用上的EJB的替代方案,比如用AOP提供聲明性事務(wù)管理;
9, Spring為數(shù)據(jù)存取提供了一個一致的框架,不論是使用JDBC還是O/R mapping的產(chǎn)品(Hibernate,JDO)。
Spring的任務(wù)描述:
Spring的主要目的就是使J2EE易用和促進良好的編程習慣。
Spring不會重新發(fā)明輪子,它是讓已有的技術(shù)更加易用,比如它沒有底層事務(wù)協(xié)調(diào)處理,但是提供了一個抽象層覆蓋了JTA和任何其他的事物策略。Spring并沒有和其他的開源項目競爭,不過還是在一些領(lǐng)域有新的方案提供,比如它的web framework,輕量級的IoC容器和AOP框架。
二,Inversion of Control容器
Spring的設(shè)計核心是org.springframework.beans包,用來協(xié)調(diào)JavaBeans的工作。這個包一般不會被用戶直接使用,而是作為其他功能的基礎(chǔ)服務(wù)。
下一個高一些的抽象概念是Bean Factory,一個Spring bean factory是一個可以通過名稱來獲取objects的通用工廠,并且管理objects之間的關(guān)系。
Bean factories支持兩種對象模式:
Singleton:默認的,最常使用的,對于無狀態(tài)的對象是一種理想的模式。
Prototype:每次獲取將創(chuàng)建一個獨立的對象,可以讓用戶擁有他們自己的對象。
由于org.springframework.beans.factory.BeanFactory是一個簡單的接口,所以你能夠方便地實現(xiàn)出你自己的BeanFactory,但是很少用戶需要這樣做;常用的BeanFactory定義是:
XmlBeanFactory:解析簡單直觀的定義類和命名對象屬性的XML結(jié)構(gòu);
ListableBeanFactoryImpl:提供了解析存放在屬性文件中的bean定義的能力;
通過BeanFactory的概念,Spring成為了一個Inversion of Control容器。IoC背后的概念就是所謂的Hollywood原則:Don’t call me, I ‘ll call you。IoC將控制創(chuàng)建的職責從對象的代碼中搬進了框架中,使用IoC容器只需指出組件需要X對象,在運行期容器會提供給它具體的對象。而容器就是通過查看方法的參數(shù)表(例如JavaBean的屬性),或者通過配置源(XML)來得到相應(yīng)的信息,從而實現(xiàn)向組件提供對象
Spring ApplicationContext是BeanFactory的子接口,為下列東西提供支持:
信息查找,支持國際化
事件機制,允許發(fā)布應(yīng)用程序以及可選的注冊已接受到事件
可移植的文件和資源訪問
三,JDBC抽象和數(shù)據(jù)訪問異常層次
JDBC提供了不錯的數(shù)據(jù)庫抽象,但是也有痛苦的地方:
需要大量的錯誤處理代碼來確保ResultSet,Statement,Connection在使用后關(guān)閉;
沒有異常的層次,使用SQLException來響應(yīng)所有的錯誤,并不知道具體錯在哪里。
Spring用兩種方法解決這些問題:
通過API把冗長易出錯的異常處理代碼從程序轉(zhuǎn)移到框架中,框架處理所有異常,而程序代碼集中精力進行SQL和處理結(jié)果上;
為要處理SQLException的程序代碼提供有意義的異常層次。當Spring第一次從數(shù)據(jù)源取得一個連接時,它檢查元數(shù)據(jù)以確定數(shù)據(jù)庫,隨后它使用這些信息把SQLException映射為自己的異常層次中的響應(yīng)的異常,是你可以和有意義的異常打交道。
Spring提供兩層JDBC API,第一個在org.springframework.jdbc.core包中,使用回調(diào)機制移動控制權(quán)從程序轉(zhuǎn)移到了框架中,這是一種不同的Inversion of Control。
在org.springframework.jdbc.object包中是對JDBC的更高層次的抽象。這是建立在核心的JDBC回調(diào)功能基礎(chǔ)之上的,但是提供了一個能夠?qū)DBMS操作的API,在這個API中無論是查詢,更新或是存儲過程,都是用Java對象來建模。這組API受到了JDO查詢API的影響,非常直接而且有用。
Spring數(shù)據(jù)訪問異常層次是基于unchecked exception的,這樣開發(fā)者可以自己決定是否來捕捉這些異常從而恢復(fù)。
Spring JDBC對你帶來的好處:
你不必像JDBC那樣寫finally;
你需要編寫的代碼變少了;
你不必鉆研RDBMS文檔去解決理解,一個因為錯誤的列名而返回的詭異錯誤碼;
不管你使用何種持久化技術(shù),你都可以方便地實現(xiàn)DAO模式,讓業(yè)務(wù)代碼不依賴于任何特定的數(shù)據(jù)訪問API。
四,O/R mapping集成
Spring提供了對Hibernate 2.x和JDO的集成支持,尤其是對Hibernate的集成。
為什么要使用Hibernate+Spring,而不是直接使用Hibernate呢?
1, 用Hibernate的代碼通常需要為了效率和適當?shù)氖聞?wù)處理而使用相同的Session對象;Spring通過在代碼層上使用顯式的template包裝類或者使用聲明式的,AOP的方法攔截(interceptor)方式兩種方案,使得能夠很容易透明地創(chuàng)建和綁定Session到當前的線程。
2, 資源管理,Spring的應(yīng)用程序context能夠處理Hibernate SessionFactories的位置和配置,JDBC數(shù)據(jù)源和其他的相關(guān)資源;使得易于管理和改變。
3, 集成的事務(wù)管理 Spring讓你能夠把你的Hibernate代碼包裝起來,通過2種方式:在代碼層上使用顯式的template包裝類,或者使用聲明式的,AOP的方法攔截(interceptor)。
4, Spring能夠包裝Hibernate異常,把它們從私有的,checked異常轉(zhuǎn)換為一套抽象的運行時異常;使得你能夠在任何你需要的地方捕捉和處理異常,并且JDBC異常也被轉(zhuǎn)換到相同的層次中,意味著你能在一致的編程模型中對JDBC執(zhí)行相同的操作。
5, 為了避免和廠商綁定 Hibernate強大,靈活,免費,當時仍然使用私有的API;Spring對Hibernate的事務(wù)和異常的抽象,使你很容易將Hibernate-specific代碼隔離開你的應(yīng)用程序部分,而不會影響Hibernate的強大功能。
6, 測試簡單 Spring的IoC使它很容易改變Hibernate session factories的位置,數(shù)據(jù)源,事務(wù)管理和映射對象執(zhí)行,這使得很容易隔離和測試每一塊持久關(guān)系代碼。
五,事務(wù)管理
JTA使一個直接用起來很笨重的API,許多J2EE開發(fā)者感到EJB CMT使對于事務(wù)管理的唯一合理的選擇。
Spring提供了它對事務(wù)管理的抽象,提供了:
1, 通過類似于JdbcTemplate的回調(diào)模板編程管理事務(wù),比起直接用JTA容易多;
2, 類似于EJB CMT的聲明式事務(wù)管理,但不需要EJB容器;
六,AOP
Spring的AOP支持的首要目標是要給POJOs提供J2EE服務(wù),而且它有能夠在應(yīng)用服務(wù)器之間移植的優(yōu)勢,Spring AOP支持method interception,關(guān)鍵概念包括:
Interception:自定義行為能夠在對接口和類的調(diào)用之前之后插入;
Introduction:指定advice會導(dǎo)致對象實現(xiàn)額外的接口,混亂了繼承;
Spring使用動態(tài)代理實現(xiàn)AOP或者在運行時使用CGLIB生成字節(jié)碼(這是的能夠代理類)。兩種方法都能夠在任何應(yīng)用服務(wù)其中使用。
Spring使實現(xiàn)了AOP Alliance接口的AOP框架(在學(xué)習AOP中介紹過)。
Spring AOP最常見的應(yīng)用使聲明式事務(wù)管理,這是基于前面描述的TransactionTemplate抽象上的,并且可以給任何POJO提供聲明式事務(wù)管理。
Spring的聲明式事務(wù)管理類似于EJB CMT,但在以下方面不同:
l 事務(wù)管理能夠應(yīng)用于任何POJO;
l 通過使用Spring的事務(wù)API能夠在事務(wù)性POJO中實現(xiàn)編程回掉。為此我們提供靜態(tài)的方法,使用ThreadLocal變量,因而不需要你傳遞EJBContext這樣的對象確保回滾;
l 你可以聲明式地定義“回滾規(guī)則”;
l 事務(wù)管理不綁定于JTA。
當然你還可以使用Spring AOP實現(xiàn)程序特有的aspects。
請對以上恢復(fù)出來的文字進行修改后提交
七,MVC web框架
Spring的MVC model類似于Struts。在多線程服務(wù)對象這點上,Spring的Controller類似于Struts Action,只有一個實例處理所有客戶請求。
Spring MVC比起Struts的優(yōu)點:
1, Spring在Controller, JavaBean, model和views提供了一個非常清晰的劃分;
2, Spring的MVC是非常靈活的。不像Struts強制你繼承它的Action和Form對象,Spring MVC完全是基于接口的;
3, Spring MVC是真正的view無關(guān)的。你不會被強制使用JSP
4, 和其他對象一樣,Spring的Controller是通過IoC配置的。使它們易于測試;
5, Web層變成了業(yè)務(wù)對象層上的薄薄一層
八,EJB相關(guān)
實現(xiàn)EJB:
如果你選擇使用EJB,Spring能在EJB實現(xiàn)和客戶端訪問EJB兩方面都提供很大的好處。
Spring為session bean和message drive bean提供了方便的超類,使得通過自動載入基于包含在EJB jar文件中的XML文檔BeanFactory讓這變得很容易。
感覺不是很有用的樣子。
使用EJB:
許多EJB程序使用Service Locator和Business Delegate模式,這些比在客戶代碼中使用JDNI查找強多了,但是還是有顯著的缺點:
l 使用EJB的典型代碼依賴Service Locator或者Business Delegate singletons,難于測試;
l 在Service Locator模式?jīng)]有使用Business Delegate的情況下,程序代碼還要在EJB home重調(diào)用create()方法,并且可能導(dǎo)致異常,代碼依然綁定在EJB API上;
l 實現(xiàn)Business Delegate模式通常導(dǎo)致顯著的代碼重復(fù);
我們只需要給需要EJB的Bean定義一個組件,在XML中指定它的jndi name,interface,Spring AOP框架會幫你為EJB創(chuàng)建一個代理,實現(xiàn)了業(yè)務(wù)方法的接口,緩存EJBHome,代理JNDI查找,調(diào)用響應(yīng)的業(yè)務(wù)方法。
從而使你的web層代碼不依賴于EJB的使用,如果你要使用POJO或其他object代替EJB引用,你只需要改動組件定義xml,而不影響代碼。