1. 程式人生 > >Spring先進思想與實用主義的集大成者

Spring先進思想與實用主義的集大成者

      Spring一個開源的Java EE輕量級框架,它的目的是提供更好的程式設計模型,從而使J2EE開發更容易。Spring的許多理念一直引領著J2EE的輕量級開發的潮流。通過對Spring的學習,切實地感覺到了Spring領先的理念以及實用主義框架與規範驅動的EJB之間的差別。
  Spring它不重複發明輪子,而是對現有的優秀的J2EE框架進行更好的抽象,提供貫穿應用各個層的更一致的程式設計模型,從而簡化J2EE的開發。所以它和WEB層的框架如Struts,JSF和持久層框架Hibernate,JDO這些單層的框架有著很大的區別。
  Spring使用控制反轉(IoC)的和麵向方面的程式設計架構,給POJO提供企業級的服務,這在J2EE中是特別有意義的。傳統的EJB元件模型,嚴重依賴於EJB容器,EJB試圖使用工具來彌補J2EE規範的不足,通過使用EJB容器生成程式碼來管理元件或生成服務。一個好的框架要比生成的程式碼靈活的多,生成程式碼技術可能在開發階段能夠提供快捷高效的方式來減少樣板式的程式碼,但在整個專案生命週期的後期(維護和排除bug)就會暴露出其隱含的複雜性。POJO這樣可脫離容器的服務,一方面可以方便在各種環境下被重用,另一方面由於脫離了容器可以更方便的進行單元測試。許多J2EE技術都太底層了,像JNDI,JDBC,對於程式設計師,需要寫許多樣板式的程式碼和捕捉異常並需要小心妥善的獲取連線關閉連線,這些J2EE API和服務沒有提供給程式設計師易於使用的檢視,以及更好的程式設計模型。而Spring就是為了提供給程式設計師更好的J2EE程式設計模型和更易用的檢視而存在的。事實上Spring一致而又良好的程式設計模型讓你避免了這種底層的操作,Spring會妥善處理好這些枯燥而又重複的底層操作。
  Spring的核心IOC容器,提供了一個強大的管理物件、服務和資源的方式。它使用DI(依賴注入)這種優秀的理念,由容器來建立管理物件,並注入其依賴的物件,從而創建出可直接使用的服務和資源,而無須使用者擔心如何裝配物件以及其依賴的物件,無須考慮如何獲取這些物件。DI要比傳統的EJB的IOC要先進的多,EJB使用JDNI來定位服務,這種lookup式的管理方式 ,使用者需要主動的去從Context中去“拉”取所需要的資源,並且需要妥善的處理JDNI的連線釋放,以及異常的處理。而這些底層的操作顯然轉移了使用者對核心業務的處理。Spring的核心IOC容器對應用程式的侵入性達到了最小,這些物件是POJO的,完全不依賴於具體的容器和環境,可以方便的進行單元測試。而傳統的EJB的服務定位方式需要依賴於EJB容器,並且如果試圖mock出Context來進行單元測試,將是困難的。同時EJB並不能提供所有型別物件的管理。
   Spring提供的AOP(面向方面程式設計)框架。AOP作為OOP的一種有益的補充,提供了另外一種思考程式碼的方式,AOP關注是橫切的方面,將橫切的服務或程式碼,抽離並組織成為一個模組或單獨的服務,避免了樣板式的程式碼遍佈在各個服務中,讓每個服務更專心的去實現其核心的業務。而這些抽離出來的服務,可以方便的織入到需要的這些服務程式碼的服務中,為其提供輔助性的服務。AOP分離了核心服務和輔助性服務的關注點,而這種分離不需要付出任何的代價(繼承指定的介面或類),整個過程對於核心業務類來說是透明的,從而使得程式碼更具有內聚性和OO性。Spring提供了使用動態代理的實現和AspectJ的整合,提供了最優秀最強大的AOP程式設計模型。通過使用AOP增強POJO的功能,從而讓POJO能夠具有勝任企業級的服務的能力,提供了與傳統EJB完全不同的實現方法。EJB通過EJB容器生成程式碼來提供管理和宣告性的服務,而這種方式丟失了很大的靈活性,而AOP這種方式可以合併組合各種最佳的服務,並且這些服務可以進行定製,AOP在宣告式事務管理、審計、安全控制、異常處理、快取處理等方面,提供了一種更好的程式設計方式。
  Java一直濫用check異常,不當check的異常,會強制你捕捉根本無法恢復的異常,這不僅使你的程式碼有“險處叢生”的感覺,更重要的是你每次處理這些毫無意義的異常會分散你的核心業務,讓你的程式碼更難讀。並且像Java的JDBC提供的異常體系太粗,一個SQLException概括了之。Spring提供了一致的細粒度uncheck異常體系,無論你使用JDBC,Hibernate,JDO,JPA,ibatis,它都把這些具體框架的異常轉化成spring的異常體系中。
  Spring鼓勵使用基於介面而不是類的程式設計方式。基於介面的程式設計方式提供了可插拔的服務方式,通過在編碼中指定依賴的介面,可以透明而方便的替換掉具體的實現類。特別是在Spring容器的管理之下,只需要在配製檔案中替換掉其依賴實現就可以切換到需要的具體的實現類。這種方式構造的系統具有很好的鬆耦合性。