eagames  
          日歷
          <2005年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345
          統(tǒng)計(jì)
          • 隨筆 - 22
          • 文章 - 0
          • 評(píng)論 - 2
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          收藏夾

          test

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

          Spring(1)
          一地雞毛 @ 2004-08-12 17:57

          看了Rod的介紹Spring的文章,翻譯后的連接:


          http://blog.csdn.net/taowen2002/archive/2004/05/07/15875.aspx

          一,Spring簡(jiǎn)介
          Spring的特點(diǎn):
          1, Spring不同于其他的Framework,它要提供的是一種管理你的業(yè)務(wù)對(duì)象的方法。
          2, Spring有分層的體系結(jié)構(gòu),意味著你能選擇僅僅使用它的任何一個(gè)獨(dú)立的部分,而其他的仍然使用你的相關(guān)實(shí)現(xiàn)。
          3, 它的設(shè)計(jì)從一開(kāi)始就是要幫助你編寫易于測(cè)試的代碼,Spring是使用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)的工程的理想框架。
          4, Spring不會(huì)給你的工程添加對(duì)其他的框架依賴;同時(shí)Spring又可以稱得上是個(gè)一攬子解決方案,提供了一個(gè)典型應(yīng)用所需要的大部分基礎(chǔ)架構(gòu)。

          Spring的好處:
          1, Spring能有效地組織你的中間層對(duì)象;(*)
          2, Spring能消除在許多工程中常見(jiàn)的對(duì)Singleton的過(guò)多使用;
          3, 通過(guò)一種在不同應(yīng)用程序和項(xiàng)目間一致的方法來(lái)處理配置文件,消除各種自定義格式的屬性文件的需要,僅僅需要看看類的JavaBean屬性。Inversion of Control的使用幫助完成了這種簡(jiǎn)化;(使用的是type2的IoC)
          4, 能夠很容易培養(yǎng)你面向接口而不是面向類的編程習(xí)慣。(這也算。。。)
          5, Spring的設(shè)計(jì)會(huì)讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于它的APIs,在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒(méi)有依賴于Spring。
          6, 使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試;
          7, Spring使EJB成為一個(gè)實(shí)現(xiàn)選擇,而不是必需的選擇。你可以用POJOs或local EJBs來(lái)實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響到調(diào)用代碼。
          8, Spring提供一些web應(yīng)用上的EJB的替代方案,比如用AOP提供聲明性事務(wù)管理;
          9, Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,不論是使用JDBC還是O/R mapping的產(chǎn)品(Hibernate,JDO)。

          Spring的任務(wù)描述:
          Spring的主要目的就是使J2EE易用和促進(jìn)良好的編程習(xí)慣。
          Spring不會(huì)重新發(fā)明輪子,它是讓已有的技術(shù)更加易用,比如它沒(méi)有底層事務(wù)協(xié)調(diào)處理,但是提供了一個(gè)抽象層覆蓋了JTA和任何其他的事物策略。Spring并沒(méi)有和其他的開(kāi)源項(xiàng)目競(jìng)爭(zhēng),不過(guò)還是在一些領(lǐng)域有新的方案提供,比如它的web framework,輕量級(jí)的IoC容器和AOP框架。


          二,Inversion of Control容器
          Spring的設(shè)計(jì)核心是org.springframework.beans包,用來(lái)協(xié)調(diào)JavaBeans的工作。這個(gè)包一般不會(huì)被用戶直接使用,而是作為其他功能的基礎(chǔ)服務(wù)。
          下一個(gè)高一些的抽象概念是Bean Factory,一個(gè)Spring bean factory是一個(gè)可以通過(guò)名稱來(lái)獲取objects的通用工廠,并且管理objects之間的關(guān)系。
          Bean factories支持兩種對(duì)象模式:
          Singleton:默認(rèn)的,最常使用的,對(duì)于無(wú)狀態(tài)的對(duì)象是一種理想的模式。
          Prototype:每次獲取將創(chuàng)建一個(gè)獨(dú)立的對(duì)象,可以讓用戶擁有他們自己的對(duì)象。

          由于org.springframework.beans.factory.BeanFactory是一個(gè)簡(jiǎn)單的接口,所以你能夠方便地實(shí)現(xiàn)出你自己的BeanFactory,但是很少用戶需要這樣做;常用的BeanFactory定義是:
          XmlBeanFactory:解析簡(jiǎn)單直觀的定義類和命名對(duì)象屬性的XML結(jié)構(gòu);
          ListableBeanFactoryImpl:提供了解析存放在屬性文件中的bean定義的能力;

          通過(guò)BeanFactory的概念,Spring成為了一個(gè)Inversion of Control容器。IoC背后的概念就是所謂的Hollywood原則:Don’t call me, I ‘ll call you。IoC將控制創(chuàng)建的職責(zé)從對(duì)象的代碼中搬進(jìn)了框架中,使用IoC容器只需指出組件需要X對(duì)象,在運(yùn)行期容器會(huì)提供給它具體的對(duì)象。而容器就是通過(guò)查看方法的參數(shù)表(例如JavaBean的屬性),或者通過(guò)配置源(XML)來(lái)得到相應(yīng)的信息,從而實(shí)現(xiàn)向組件提供對(duì)象

          Spring ApplicationContext是BeanFactory的子接口,為下列東西提供支持:
          信息查找,支持國(guó)際化
          事件機(jī)制,允許發(fā)布應(yīng)用程序以及可選的注冊(cè)已接受到事件
          可移植的文件和資源訪問(wèn)


          三,JDBC抽象和數(shù)據(jù)訪問(wèn)異常層次
          JDBC提供了不錯(cuò)的數(shù)據(jù)庫(kù)抽象,但是也有痛苦的地方:
          需要大量的錯(cuò)誤處理代碼來(lái)確保ResultSet,Statement,Connection在使用后關(guān)閉;
          沒(méi)有異常的層次,使用SQLException來(lái)響應(yīng)所有的錯(cuò)誤,并不知道具體錯(cuò)在哪里。
          Spring用兩種方法解決這些問(wèn)題:
          通過(guò)API把冗長(zhǎng)易出錯(cuò)的異常處理代碼從程序轉(zhuǎn)移到框架中,框架處理所有異常,而程序代碼集中精力進(jìn)行SQL和處理結(jié)果上;
          為要處理SQLException的程序代碼提供有意義的異常層次。當(dāng)Spring第一次從數(shù)據(jù)源取得一個(gè)連接時(shí),它檢查元數(shù)據(jù)以確定數(shù)據(jù)庫(kù),隨后它使用這些信息把SQLException映射為自己的異常層次中的響應(yīng)的異常,是你可以和有意義的異常打交道。

          Spring提供兩層JDBC API,第一個(gè)在org.springframework.jdbc.core包中,使用回調(diào)機(jī)制移動(dòng)控制權(quán)從程序轉(zhuǎn)移到了框架中,這是一種不同的Inversion of Control。
          在org.springframework.jdbc.object包中是對(duì)JDBC的更高層次的抽象。這是建立在核心的JDBC回調(diào)功能基礎(chǔ)之上的,但是提供了一個(gè)能夠?qū)DBMS操作的API,在這個(gè)API中無(wú)論是查詢,更新或是存儲(chǔ)過(guò)程,都是用Java對(duì)象來(lái)建模。這組API受到了JDO查詢API的影響,非常直接而且有用。

          Spring數(shù)據(jù)訪問(wèn)異常層次是基于unchecked exception的,這樣開(kāi)發(fā)者可以自己決定是否來(lái)捕捉這些異常從而恢復(fù)。

          Spring JDBC對(duì)你帶來(lái)的好處:
          你不必像JDBC那樣寫finally;
          你需要編寫的代碼變少了;
          你不必鉆研RDBMS文檔去解決理解,一個(gè)因?yàn)殄e(cuò)誤的列名而返回的詭異錯(cuò)誤碼;
          不管你使用何種持久化技術(shù),你都可以方便地實(shí)現(xiàn)DAO模式,讓業(yè)務(wù)代碼不依賴于任何特定的數(shù)據(jù)訪問(wèn)API。


          四,O/R mapping集成
          Spring提供了對(duì)Hibernate 2.x和JDO的集成支持,尤其是對(duì)Hibernate的集成。
          為什么要使用Hibernate+Spring,而不是直接使用Hibernate呢?
          1, 用Hibernate的代碼通常需要為了效率和適當(dāng)?shù)氖聞?wù)處理而使用相同的Session對(duì)象;Spring通過(guò)在代碼層上使用顯式的template包裝類或者使用聲明式的,AOP的方法攔截(interceptor)方式兩種方案,使得能夠很容易透明地創(chuàng)建和綁定Session到當(dāng)前的線程。
          2, 資源管理,Spring的應(yīng)用程序context能夠處理Hibernate SessionFactories的位置和配置,JDBC數(shù)據(jù)源和其他的相關(guān)資源;使得易于管理和改變。
          3, 集成的事務(wù)管理 Spring讓你能夠把你的Hibernate代碼包裝起來(lái),通過(guò)2種方式:在代碼層上使用顯式的template包裝類,或者使用聲明式的,AOP的方法攔截(interceptor)。
          4, Spring能夠包裝Hibernate異常,把它們從私有的,checked異常轉(zhuǎn)換為一套抽象的運(yùn)行時(shí)異常;使得你能夠在任何你需要的地方捕捉和處理異常,并且JDBC異常也被轉(zhuǎn)換到相同的層次中,意味著你能在一致的編程模型中對(duì)JDBC執(zhí)行相同的操作。
          5, 為了避免和廠商綁定 Hibernate強(qiáng)大,靈活,免費(fèi),當(dāng)時(shí)仍然使用私有的API;Spring對(duì)Hibernate的事務(wù)和異常的抽象,使你很容易將Hibernate-specific代碼隔離開(kāi)你的應(yīng)用程序部分,而不會(huì)影響Hibernate的強(qiáng)大功能。
          6, 測(cè)試簡(jiǎn)單 Spring的IoC使它很容易改變Hibernate session factories的位置,數(shù)據(jù)源,事務(wù)管理和映射對(duì)象執(zhí)行,這使得很容易隔離和測(cè)試每一塊持久關(guān)系代碼。

          五,事務(wù)管理
          JTA使一個(gè)直接用起來(lái)很笨重的API,許多J2EE開(kāi)發(fā)者感到EJB CMT使對(duì)于事務(wù)管理的唯一合理的選擇。
          Spring提供了它對(duì)事務(wù)管理的抽象,提供了:
          1, 通過(guò)類似于JdbcTemplate的回調(diào)模板編程管理事務(wù),比起直接用JTA容易多;
          2, 類似于EJB CMT的聲明式事務(wù)管理,但不需要EJB容器;


          六,AOP
          Spring的AOP支持的首要目標(biāo)是要給POJOs提供J2EE服務(wù),而且它有能夠在應(yīng)用服務(wù)器之間移植的優(yōu)勢(shì),Spring AOP支持method interception,關(guān)鍵概念包括:
          Interception:自定義行為能夠在對(duì)接口和類的調(diào)用之前之后插入;
          Introduction:指定advice會(huì)導(dǎo)致對(duì)象實(shí)現(xiàn)額外的接口,混亂了繼承;

          Spring使用動(dòng)態(tài)代理實(shí)現(xiàn)AOP或者在運(yùn)行時(shí)使用CGLIB生成字節(jié)碼(這是的能夠代理類)。兩種方法都能夠在任何應(yīng)用服務(wù)其中使用。
          Spring使實(shí)現(xiàn)了AOP Alliance接口的AOP框架(在學(xué)習(xí)AOP中介紹過(guò))。

          Spring AOP最常見(jiàn)的應(yīng)用使聲明式事務(wù)管理,這是基于前面描述的TransactionTemplate抽象上的,并且可以給任何POJO提供聲明式事務(wù)管理。
          Spring的聲明式事務(wù)管理類似于EJB CMT,但在以下方面不同:
          l 事務(wù)管理能夠應(yīng)用于任何POJO;
          l 通過(guò)使用Spring的事務(wù)API能夠在事務(wù)性POJO中實(shí)現(xiàn)編程回掉。為此我們提供靜態(tài)的方法,使用ThreadLocal變量,因而不需要你傳遞EJBContext這樣的對(duì)象確保回滾;
          l 你可以聲明式地定義“回滾規(guī)則”;
          l 事務(wù)管理不綁定于JTA。
          當(dāng)然你還可以使用Spring AOP實(shí)現(xiàn)程序特有的aspects。
          請(qǐng)對(duì)以上恢復(fù)出來(lái)的文字進(jìn)行修改后提交
          七,MVC web框架
          Spring的MVC model類似于Struts。在多線程服務(wù)對(duì)象這點(diǎn)上,Spring的Controller類似于Struts Action,只有一個(gè)實(shí)例處理所有客戶請(qǐng)求。
          Spring MVC比起Struts的優(yōu)點(diǎn):
          1, Spring在Controller, JavaBean, model和views提供了一個(gè)非常清晰的劃分;
          2, Spring的MVC是非常靈活的。不像Struts強(qiáng)制你繼承它的Action和Form對(duì)象,Spring MVC完全是基于接口的;
          3, Spring MVC是真正的view無(wú)關(guān)的。你不會(huì)被強(qiáng)制使用JSP
          4, 和其他對(duì)象一樣,Spring的Controller是通過(guò)IoC配置的。使它們易于測(cè)試;
          5, Web層變成了業(yè)務(wù)對(duì)象層上的薄薄一層


          八,EJB相關(guān)
          實(shí)現(xiàn)EJB:
          如果你選擇使用EJB,Spring能在EJB實(shí)現(xiàn)和客戶端訪問(wèn)EJB兩方面都提供很大的好處。
          Spring為session bean和message drive bean提供了方便的超類,使得通過(guò)自動(dòng)載入基于包含在EJB jar文件中的XML文檔BeanFactory讓這變得很容易。
          感覺(jué)不是很有用的樣子。

          使用EJB:
          許多EJB程序使用Service Locator和Business Delegate模式,這些比在客戶代碼中使用JDNI查找強(qiáng)多了,但是還是有顯著的缺點(diǎn):
          l 使用EJB的典型代碼依賴Service Locator或者Business Delegate singletons,難于測(cè)試;
          l 在Service Locator模式?jīng)]有使用Business Delegate的情況下,程序代碼還要在EJB home重調(diào)用create()方法,并且可能導(dǎo)致異常,代碼依然綁定在EJB API上;
          l 實(shí)現(xiàn)Business Delegate模式通常導(dǎo)致顯著的代碼重復(fù);
          我們只需要給需要EJB的Bean定義一個(gè)組件,在XML中指定它的jndi name,interface,Spring AOP框架會(huì)幫你為EJB創(chuàng)建一個(gè)代理,實(shí)現(xiàn)了業(yè)務(wù)方法的接口,緩存EJBHome,代理JNDI查找,調(diào)用響應(yīng)的業(yè)務(wù)方法。
          從而使你的web層代碼不依賴于EJB的使用,如果你要使用POJO或其他object代替EJB引用,你只需要改動(dòng)組件定義xml,而不影響代碼。
           

          posted on 2005-10-21 22:20 EA_Games 閱讀(304) 評(píng)論(0)  編輯  收藏 所屬分類: Spring

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © EA_Games Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 北碚区| 梧州市| 乡宁县| 贡嘎县| 深水埗区| 开封县| 伽师县| 封丘县| 金川县| 普安县| 衡水市| 通河县| 资溪县| 高安市| 牡丹江市| 临澧县| 邹平县| 平顶山市| 芜湖市| 建德市| 甘南县| 台东市| 海南省| 中超| 田林县| 瑞安市| 河池市| 保德县| 常宁市| 柳河县| 玉溪市| 扶沟县| 图木舒克市| 保亭| 清水河县| 陆丰市| 阳春市| 中江县| 柳江县| 边坝县| 金塔县|