Spring學習筆記: Spring概述

Spring是什麼?

Spring 是一個開源的輕量級 Java SE( Java 標準版本)/Java EE( Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程序開發。在傳統應用程序開發中,一個完整的應用是由一組相互協作的對象組成的。所以開發一個應用除了要開發業務邏輯之外,最多的是關注使這些對象協作來完成所需功能的同時,實現低耦合、高內聚。所以,業務邏輯開發是不可避免的。如果有個框架可以幫我們來創建對象及管理這些對象之間的依賴關係,能通過配置方式來創建對象,管理對象之間依賴關係,我們不需要通過工廠和生成器來創建及管理對象之間的依賴關係,這樣我們必然會減少許多工作量,加快開發。Spring 框架問世之初主要就是來完成這個功能。

Spring 框架除了幫我們管理對象及其依賴關係,還提供像通用日誌記錄、性能統計、安全控制、異常處理等面向切面的能力,可以幫我們管理最頭疼的數據庫事務,同時,它本身提供了一套簡單的 JDBC 訪問實現,能與第三方數據庫訪問框架集成(如 Hibernate、JPA ),與各種 Java EE 技術整合(如 Java Mail、任務調度等等),提供一套自己的 web 層框架 Spring MVC 、而且還能非常簡單的與第三方 web 框架集成。從這裏我們可以認爲 Spring 是一個超級粘合平臺,除了自己提供功能外,還提供粘合其他技術和框架的能力,從而使我們可以更自由的選擇到底使用什麼技術進行開發。而且不管是 JAVA SE( C/S 架構)應用程序還是 JAVA EE( B/S 架構)應用程序都可以使用這個平臺進行開發。

Spring能幫我們幹什麼?

  1. Spring 能幫我們根據配置文件創建及組裝對象之間的依賴關係

    傳統程序開發,創建對象及組裝對象間依賴關係由我們在程序內部進行控制,這樣會加大各個對象間的耦合,如果我們要修改對象間的依賴關係就必須修改源代碼,重新編譯、部署;而如果採用 Spring,則由 Spring 根據配置文件來進行創建及組裝對象間依賴關係,只需要改配置文件即可,無需重新編譯。

  2. Spring 面向切面編程能幫助我們無耦合的實現日誌記錄、性能統計、安全控制

    當我們要進行一些日誌記錄、權限控制、性能統計等工作時,在傳統應用程序當中我們可能在需要的對象或方法中進行,而且比如權限控制、性能統計大部分是重複的,這樣代碼中就存在大量重複代碼,即使把通用部分提取出來,仍舊存在重複調用,像性能統計我們可能只是在必要時才進行,在診斷完畢後要刪除這些代碼;還有日誌記錄,比如記錄一些方法訪問日誌、數據訪問日誌等等,這些都會滲透到各個訪問方法中;還有權限控制,必須在方法執行時開始進行審覈,可見這些工作急需優化。如果採用 Spring ,這些日誌記錄、權限控制、性能統計從業務邏輯中分離出來,通過 Spring 支持的面向切面編程,動態添加這些功能,無需滲透到各個需要的方法或對象中。反觀其他的解決方案,通過使用“代理設計模式”或“包裝器設計模式”,仍需通過編程方式來創建代理對象,仍需耦合這些代理對象,而採用 Spring 面向切面編程能提供一種更好的方式來完成上述功能。通過配置方式,而不需要在現有代碼中添加任何額外代碼,使現有代碼專注業務邏輯。

  3. Spring能非常簡單的幫我們管理數據庫事務

    在傳統應用程序當中,我們如何來完成數據庫事務管理?需要一系列“獲取連接,執行 SQL,提交或回滾事務,關閉連接”,而且還要保證在最後一定要關閉連接,多麼可怕的事情,而且也很無聊;如果採用 Spring,我們只需獲取連接,執行 SQL,其他的都交給 Spring 來管理,簡單方便。

Spring的優點

優點

  • 非常輕量級的容器:以集中的、自動化的方式進行應用程序對象創建和裝配,除此之外還會負責管理對象生命週期,能組合成複雜的應用程序。Spring 容器是非侵入式的(不需要依賴任何 Spring 特定類),而且完全採用 POJOs 進行開發,使應用程序更容易測試、更容易管理。而且核心 JAR 包非常小,Spring3.0.5 不到 1 M ,而且不需要依賴任何應用服務器,可以部署在任何環境( Java SE 或 Java EE )。
  • AOP: AOP 是 Aspect Oriented Programming 的縮寫,意思是面向切面編程。從另一個角度來考慮程序結構以完善面向對象編程( OOP ),即可以通過在編譯期間、裝載期間或運行期間實現在不修改源代碼的情況下給程序動態添加功能的一種技術。通俗點說就是把可重用的功能提取出來,然後將這些通用功能在合適的時候織入到應用程序中;比如安全,日誌記錄,這些都是通用的功能,我們可以把它們提取出來,然後在程序執行的合適地方植入這些代碼並執行它們,從而完成需要的功能並複用了這些功能。
  • 簡單的數據庫事務管理:在使用數據庫的應用程序當中,自己管理數據庫事務是一項很讓人頭疼的事,而且很容易出現錯誤,Spring 支持可插入的事務管理支持,而且無需 JavaEE 環境支持,通過 Spring 管理事務可以把我們從事務管理中解放出來來專注業務邏輯。
  • JDBC 抽象及 ORM (對象關係映射)框架支持: Spring 使 JDBC 更加容易使用;提供 DAO(數據訪問對象)支持,非常方便集成第三方 ORM 框架,比如 Hibernate 等;並且完全支持 Spring 事務和使用 Spring 提供的一致的異常體系。
  • 靈活的 Web 層支持: Spring 本身提供一套非常強大的 MVC 框架,而且可以非常容易的與第三方 MVC 框架集成,比如 Struts 等。
  • 簡化各種技術集成:提供對 Java Mail 、任務調度、 JMX 、 JMS 、 JNDI 、 EJB 、動態語言、遠程訪問、 Web Service 等的集成。

Spring 能幫助我們簡化應用程序開發,幫助我們創建和組裝對象,爲我們管理事務,簡單的 MVC 框架,可以把 Spring 看作是一個超級粘合平臺,能把很多技術整合在一起,形成一個整體,使系統結構更優良、性能更出衆,從而加速我們程序開發,有如上優點,我們沒有理由不考慮使用它。

關鍵名詞解釋
* 應用程序:能完成我們所需要功能的成品,比如購物網站、OA 系統。
* 框架:能完成一定功能的半成品,比如我們可以使用框架進行購物網站開發;框架做一部分功能,我們自己做一部分功能,輔助高效工作。而且框架規定了你在開發應用程序時的整體架構,提供了一些基礎功能,還規定了類和對象的如何創建、如何協作等,從而簡化我們的代碼編寫,讓我們專注於業務邏輯開發。
* 非侵入式設計:從框架角度可以這樣理解,無需繼承框架提供的類,這種設計就可以看作是非侵入式設計,如果繼承了這些框架類,就是侵入設計,如果以後想更換框架,之前寫過的代碼幾乎無法重用,如果非侵入式設計則之前寫過的代碼仍然可以繼續使用。
* 輕量級與重量級:輕量級是相對於重量級而言的,輕量級一般就是非入侵性的、所依賴的東西非常少、資源佔用非常少、部署簡單等等,其實就是比較容易使用,而重量級正好相反。
* POJO : POJO ( Plain Ordinary Java Object )簡單的 Java 對象。它可以包含業務邏輯或持久化邏輯,但不擔當任何特殊角色且不繼承或不實現任何其它 Java 框架的類或接口。
* 容器:在日常生活中容器就是一種盛放東西的器具,從程序設計角度看就是裝對象的的對象,因爲存在放入、拿出等操作,所以容器還要管理對象的生命週期。
* 控制反轉:即 Inversion of Control ,縮寫爲 IoC ,控制反轉還有一個名字叫做依賴注入( Dependency Injection ),就是由容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控。
* Bean :一般指容器管理對象,在 Spring 中指 Spring IoC 容器管理對象。

如何學好Spring

明確Spring的核心特性

要學好 Spring,首先要明確 Spring 是個什麼東西,能幫我們做些什麼事情,知道了這些然後做個簡單的例子,這樣就基本知道怎麼使用 Spring了。Spring 核心是 IoC 容器,所以一定要透徹理解什麼是控制反轉( IoC )容器,以及如何配置及使用容器,其他所有技術都是基於容器實現的;理解好 IoC 後,接下來是面向切面編程( AOP ),首先還是明確概念,基本配置,最後是實現原理,接下來就是數據庫事務管理,其實 Spring 管理事務是通過面向切面編程實現的,所以基礎很重要, IoC 容器和 AOP 學好,其餘都是基於這兩個核心東西的實現,學起來就更加輕鬆了。

Spring架構

這裏寫圖片描述

Spring核心容器:Core、Beans、Context、EL模塊

  • Core 模塊:封裝了框架依賴的最底層部分,包括資源訪問、類型轉換及一些常用工具類。
  • Beans 模塊:提供了框架的基礎部分,包括控制反轉( IOC )和依賴注入( DI )。其中 BeanFactory 是容器核心,本質是“工廠設計模式”的實現,而且無需編程實現“單例設計模式”,單例完全由容器控制,而且提倡面向接口編程,而非面向實現編程;所有應用程序對象及對象間關係由框架管理,從而真正從程序邏輯中把維護對象之間的依賴關係提取出來,所有這些依賴關係都由 BeanFactory 來維護。
  • Context 模塊:以 Core 和 Beans 爲基礎,集成 Beans 模塊功能並添加資源綁定、數據驗證、國際化、 Java EE 支持、容器生命週期、事件傳播等;核心接口是 ApplicationContext 。
  • EL 模塊:提供強大的表達式語言支持,支持訪問和修改屬性值,方法調用,支持訪問及修改數組、容器和索引器,命名變量,支持算數和邏輯運算,支持從 Spring 容器獲取 Bean, 它也支持列表投影、選擇和一般的列表聚合等。

AOP 、Aspects模塊

  • AOP 模塊: Spring AOP 模塊提供了符合 AOP Alliance 規範的面向切面的編程( aspect-oriented programming )實現,提供比如日誌記錄、權限控制、性能統計等通用功能和業務邏輯分離的技術,並且能動態的把這些功能添加到需要的代碼中;這樣各專其職,降低業務邏輯和通用功能的耦合。
  • Aspects 模塊:提供了對 AspectJ 的集成,AspectJ 提供了比 Spring ASP 更強大的功能。
  • 數據訪問/集成模塊:該模塊包括了 JDBC 、 ORM 、 OXM 、 JMS 和事務管理。
  • 事務模塊:該模塊用於 Spring 管理事務,只要是 Spring 管理對象都能得到 Spring 管理事務的好處,無需在代碼中進行事務控制了,而且支持編程和聲明性的事務管理。
  • JDBC 模塊:提供了一個 JBDC 的樣例模板,使用這些模板能消除傳統冗長的 JDBC 編碼還有必須的事務控制,而且能享受到 Spring 管理事務的好處。
  • ORM 模塊:提供與流行的“對象-關係”映射框架的無縫集成,包括 Hibernate 、JPA 、 MyBatis 等。而且可以使用 Spring 事務管理,無需額外控制事務。
  • OXM 模塊:提供了一個對 Object / XML 映射實現,將 java 對象映射成 XML 數據,或者將 XML 數據映射成 java 對象, Object / XML 映射實現包括 JAXB 、 Castor 、 XMLBeans 和 XStream 。
  • JMS 模塊:用於 JMS ( Java Messaging Service ),提供一套 “消息生產者、消息消費者”模板用於更加簡單的使用 JMS , JMS 用於用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通信。
  • Web / Remoting 模塊: Web / Remoting 模塊包含了 Web 、 Web-Servlet 、 Web-Struts 、 Web-Porlet 模塊。
  • Web 模塊:提供了基礎的 web 功能。例如多文件上傳、集成 IoC 容器、遠程過程訪問( RMI 、Hessian 、 Burlap )以及 Web Service 支持,並提供一個 RestTemplate 類來提供方便的 Restful services 訪問。
  • Web-Servlet 模塊:提供了一個 Spring MVC Web 框架實現。Spring MVC 框架提供了基於註解的請求資源注入、更簡單的數據綁定、數據驗證等及一套非常易用的 JSP 標籤,完全無縫與 Spring 其他技術協作。
  • Web-Struts 模塊:提供了與 Struts 無縫集成, Struts1.x 和 Struts2.x 都支持。
  • Test 模塊: Spring 支持 Junit 和 TestNG 測試框架,而且還額外提供了一些基於 Spring 的測試功能,比如在測試 Web 框架時,模擬 Http 請求的功能。

Spring應用場景

web應用場景

這裏寫圖片描述

遠程訪問應用場景

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章