1. 程式人生 > 實用技巧 >細談Spring(一)spring簡介

細談Spring(一)spring簡介

Spring是一個開源框架,是為了解決企業應用程式開發複雜性而建立的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個元件,同時為J2EE應用程式開發提供整合的框架。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是個輕量級容器(container),實現了IoCInversionofControl)模式的容器,Spring的目標是實現一個全方位的整合框架,在Spring框架下實現多個子框架的組合,這些子框架之間彼此可以獨立,也可以使用其它的框架方案加以替代,Spring

希望提供one-stopshop的框架整合方案

簡單來說,Spring是一個輕量級的控制反轉(IOC和麵向切面(AOP)的容器框架。 

輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR檔案裡釋出。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的物件不依賴於Spring的特定類。  

控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoCJNDI

相反——不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。  

面向切面——Spring提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。  

容器——Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型prototype),你的bean可以建立一個單獨的例項或者每次需要時都生成一個新的例項

——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。  

框架——Spring可以將簡單的元件配置、組合成為複雜的應用。在Spring中,應用物件被宣告式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(事務管理、持久化框架整合等等),將應用邏輯的開發留給了你。  所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的程式碼。它們也為Spring中的各種模組提供了基礎支援。

Spring框架是一個分層架構7個定義良好的模組組成。Spring模組構建在核心容器之上,核心容器定義了建立、配置和管理bean的方式,如下圖所示:


Spring框架的分為7個模組,組成Spring框架的每個模組(或元件)都可以單獨存在,或者與其他一個或多個模組聯合實現。每個模組的功能如下:

  1.核心容器:核心容器提供Spring框架的基本功能。核心容器的主要元件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。
  2.Spring上下文Spring上下文是一個配置檔案,向Spring框架提上下文資訊。Spring上下文包括企業服務,例如JNDIEJB、電子郵件、國際化、校驗和排程功能。
  3.SpringAOP:通過配置管理特性,SpringAOP模組直接將面向方面的程式設計功能整合到了Spring框架中。所以,可以很容易地使Spring框架管理的任何物件支援AOPSpringAOP模組為基於Spring的應用程式中的物件提供了事務管理服務。通過使用SpringAOP,不用依賴EJB元件,就可以將宣告性事務管理整合到應用程式中。
4.SpringDAOJDBCDAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。SpringDAO的面向JDBC的異常遵從通用的DAO異常層次結構。
5.SpringORMSpring框架插入了若干個ORM框架,從而提供了ORM的物件關係工具,其中包括JDOHibernateiBatisSQLMap。所有這些都遵從Spring的通用事務和DAO異常層次結構。
  6.SpringWeb模組Web上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供了上下文。所以,Spring框架支援與JakartaStruts的整合。Web模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。
  7.SpringMVC框架MVC框架是一個全功能的構建Web應用程式的MVC實現。通過策略介面,MVC框架變成為高度可配置的,MVC容納了大量檢視技術,其中包括JSPVelocityTilesiTextPOI

  Spring框架的功能可以用在任何J2EE伺服器中,大多數功能也適用於不受管理的環境。Spring的核心要點是:支援不繫結到特定J2EE服務的可重用業務和資料訪問物件。毫無疑問,這樣的物件可以在不同J2EE環境(WebEJB)、獨立應用程式、測試環境之間重用。

總結起來,Spring有如下優點:  

1.低侵入式設計,程式碼汙染極低  

2.獨立於各種應用伺服器,可以真正實現WriteOnce,RunAnywhere的承諾  

3.SpringDI機制降低了業務物件替換的複雜性  

4.Spring並不完全依賴於Spring,開發者可自由選用Spring框架的部分或全部

IOCAOP:這兩個概念可以算是spring中的核心了,這兩個概念非常抽象,並且也不容易理解,所以我們下面來簡單來描述一下這兩個概念。
  控制反轉模式(也稱作依賴性介入)的基本概念是:不建立物件,但是描述建立它們的方式。在程式碼中不直接與物件和服務連線,但在配置檔案中描述哪一個元件需要哪一項服務。容器(在Spring框架中是IOC容器)負責將這些聯絡在一起。在典型的IOC場景中,容器建立了所有物件,並設定必要的屬性將它們連線在一起,決定什麼時間呼叫方法。下表列出了IOC的一個實現模式。


型別1

服務需要實現專門的介面,通過介面,由物件提供這些服務,可以從物件查詢依賴性(例如,需要的附加服務),這種用的很少

型別2

通過JavaBean的屬性(例如setter方法)分配依賴性

型別3

依賴性以建構函式的形式提供,不以JavaBean屬性的形式公開


Spring框架的IOC容器主要採用型別2和型別3實現。

  面向方面的程式設計,即AOP,是一種程式設計技術,它允許程式設計師對橫切關注點或橫切典型的職責分界線的行為(例如日誌和事務管理)進行模組化。AOP的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模組中。

  AOPIOC是補充性的技術,它們都運用模組化方式解決企業應用程式開發中的複雜問題。在典型的面向物件開發方式中,可能要將日誌記錄語句放在所有方法和Java類中才能實現日誌功能。在AOP方式中,可以反過來將日誌服務模組化,並以宣告的方式將它們應用到需要日誌的元件上。當然,優勢就是Java類不需要知道日誌服務的存在,也不需要考慮相關的程式碼。所以,用SpringAOP編寫的應用程式程式碼是鬆散耦合的。AOP的功能完全整合到了Spring事務管理、日誌和其他各種特性的上下文中。

IOC容器:Spring設計的核心是org.springframework.beans包,它的設計目標是與JavaBean元件一起使用。這個包通常不是由使用者直接使用,而是由伺服器將其用作其他多數功能的底層中介。下一個最高階抽象是BeanFactory介面,它是工廠設計模式的實現,允許通過名稱建立和檢索物件。BeanFactory也可以管理物件之間的關係。


BeanFactory支援兩個物件模型

1.單態模型提供了具有特定名稱的物件的共享例項,可以在查詢時對其進行檢索。Singleton是預設的也是最常用的物件模型。對於無狀態服務物件很理想。
2.原型模型確保每次檢索都會建立單獨的物件。在每個使用者都需要自己的物件時,原型模型最適合。
bean工廠的概念是Spring作為IOC容器的基礎。IOC將處理事情的責任從應用程式程式碼轉移到框架。正如我將在下一個示例中演示的那樣,Spring框架使用JavaBean屬性和配置資料來指出必須設定的依賴關係。

 Spring的原始碼設計精妙、結構清晰、匠心獨用,處處體現著大師對java設計模式靈活運用以及對Java技術的高深造詣。Spring框架原始碼無疑是Java技術的最佳實踐範例。如果想在短時間內迅速提高自己的Java技術水平和應用開發水平,學習和研究Spring原始碼將會使你收到意想不到的效果。可是從哪著手研究Spring卻是很多新手頭疼的地方,下面的參考資料將帶領大家慢慢的深入解析Spring

1Spring中的事務處理

2ioc容器在Web容器中的啟動

3SpringJDBC

4SpringMVC

5SpringAOP獲取Proxy

6Spring宣告式事務處理

7SpringAOP中對攔截器呼叫的實現

8Spring驅動Hibernate的實現

9SpringAcegi框架鑑權的實現


轉載於:https://blog.51cto.com/wuwen2011/1542001