Spring框架

**Spring 框架**是 Java 平台的一個開源的全棧（full-stack）應用程式框架和控制反轉容器實現，一般被直接稱為 Spring。該框架的一些核心功能理論上可用於任何 Java 應用，但 Spring 還為基於 Java 企業版平台構建的 Web 應用提供了大量的擴充支援。Spring 沒有直接實現任何的編程模型，但它已經在 Java 社群中廣為流行，基本上完全代替了企業級 JavaBeans（EJB）模型。

Spring 框架以 Apache License 2.0 開源許可協定的形式發布，該框架最初由 Rod Johnson 以及 Juergen Hoeller 等人開發。

## 版本歷史

第一版由 Rod Johnson 開發，並在 2002 年 10 月發布在 _Expert One-on-One J2EE Design and Development_ 一書中。2003 年 6 月，Spring Framework 第一次發布在 Apache 2.0 許可證下。2004 年 3 月，發布了里程碑的版本 1.0，2004 年 9 月以及 2005 年 3 月，又發布了新的里程碑版本。2006 年，Spring Framework 獲得了 Jolt 生產力獎 和 JAX 創新獎。

2006 年 10 月發布 Spring 2.0，2007 年 11 月 Spring 2.5，2009 年 12 月 Spring 3.0，2011 年 Spring 3.1，2013 年 11 月 Spring 3.2.5，2013 年 12 月發布了 4.0 版本。值得注意的是，Spring 4.0 版本中增加了對 Java SE 8, Groovy 2, Java EE 7 的一些方面以及 WebSocket 的支援。

2017 年 9 月 Spring Framework 正式發布了 5.0 版本，此版本引入了 Spring WebFlux，一個高效能、回應式、非同步的 Web 框架。Spring 5.0 重點加強了對函式語言程式設計、回應式程式設計（reactive programming）的支援能力，是一個非常大的進步。

## 核心功能模組

* 強大的、基於 JavaBeans 的、採用控制反轉（Inversion of Control，IoC）原則的 組態管理，使得應用程式的組建更加簡易快捷。
* 一個可用於 Java EE 等執行環境的核心 Bean 工廠。
* 資料庫事務的一般化抽象層，允許聲明式（Declarative）事務管理器，簡化事務的劃分使之與底層無關。
* 內建的針對 JTA 和單個 JDBC 資料來源的一般化策略，使 Spring 的事務支援不要求 Java EE 環境，這與一般的 JTA 或者 EJB CMT 相反。
* JDBC 抽象層提供了有針對性的異常等級（不再從 SQL 異常中提取原始代碼），簡化了錯誤處理，大大減少了程式設計師的編碼量。再次利用 JDBC 時，你無需再寫出另一個 ' 終止 '（finally）模組。並且面向 JDBC 的異常與 Spring 通用資料存取物件（Data Access Object）異常等級相一致。
* 以資源容器，DAO 實現和事務策略等形式與 Hibernate，JDO 和 MyBatis 、SQL Maps 整合。利用控制反轉機制全面解決了許多典型的 Hibernate 整合問題。所有這些全部遵從 Spring 通用事務處理和通用資料存取物件異常等級規範。
* 靈活的基於核心 Spring 功能的 MVC 網頁應用程式框架。開發者通過策略介面將擁有對該框架的高度控制，因而該框架將適應於多種呈現（View）技術，例如 JSP、FreeMarker、Velocity、Thymeleaf 等。值得注意的是，Spring 中間層可以輕易地結合於任何基於 MVC 框架的網頁層，例如 Struts、WebWork 或 Tapestry。
* 提供諸如事務管理等服務的 AOP 框架。

在設計應用程式 Model 時，MVC 模式（例如 Struts）通常難於給出一個簡潔明了的框架結構。Spring 卻具有能夠讓這部分工作變得簡單的能力。程式開發員們可以使用 Spring 的 JDBC 抽象層重新設計那些複雜的框架結構。

### 控制反轉容器（依賴注入）

控制反轉（IOC，Inverse Of Control），即把建立物件的權利交給框架，也就是指將物件的建立、物件的儲存、物件的管理交給了 Spring 容器。Spring 容器是 Spring 中的一個核心模組，用於管理物件，底層可以理解為是一個 Map 集合。

### 面向切面編程

面向切面編程（Aspect-Oriented Programming, AOP） 就是將那些與業務無關，卻為業務模組所共同呼叫的邏輯或責任分開封裝起來，便於減少系統的重複代碼，降低模組間的耦合度，並有利於未來的可操作性和可維護性。

### 資料存取（DAO 層支援）

**Spring Data** 實現了對資料存取介面的統一，支援多種資料庫存取框架或組件（如：JDBC、Hibernate、MyBatis（iBatis））作為最終資料存取的實現。

### 事務管理

Spring 框架為事務管理提供了一致的抽象，具有以下優點：

* 跨不同事務 API（如：Java 事務、JDBC、Hibernate 和 Java Persistence API 事務（JPA））的一致編程模型
* 支援聲明式事務
* 與諸如 JTA 之類的複雜事務 API 相比，用於程序化事務管理的 API 更簡單
* 與 Spring 的資料存取抽象出色地整合

### 模型 - 視圖 - 控制器（MVC）

**Spring MVC** 實現了基於 MVC 設計方法的實現，結合基於 Java 註解的組態，允許開發者開發出低代碼侵入的 Web 應用專案，並簡便地實現大部分 Web 功能（包括請求參數注入、檔案上傳控制等）。

### 遠端存取

### 「約定大於組態」的快速應用開發

#### Spring Boot

Spring Boot 是基於 Spring Framework 4.0 衍生的，用於快速搭建獨立的基於生產級別的 Spring 應用的框架，可以以最小的依賴引入來構建一個 Spring 應用。並且它還具有以下特點：

* 擁有嵌入式的 Tomcat, Jetty, Undertow 或者 Reactor Netty（無需部署 war 檔案）
* 儘可能地自動組態（@AutoConfiguration）Spring 和第三方庫
* 提供用於生產的功能，例如指標、執行狀態檢查和外部化組態
* 無需麻煩而冗餘的 XML 組態，一切都可以使用 Java 組態

### 批次處理

### 整合框架

## 相關連結

* Spring Framework（頁面存檔備份，存於網際網路檔案館）
  * Spring Framework API（頁面存檔備份，存於網際網路檔案館）（Javadoc）
  * http://www.springframework.org/dtd/spring-beans.dtd（頁面存檔備份，存於網際網路檔案館）
    * http://www.springframework.org/docs/reference/springbeansdtd.html（頁面存檔備份，存於網際網路檔案館） (as HTML)
* Spring Framework .NET（頁面存檔備份，存於網際網路檔案館）
* Spring Framework MVC Tutorial（頁面存檔備份，存於網際網路檔案館）
* Simple Spring Demo（頁面存檔備份，存於網際網路檔案館）
* Introduction to the Spring Framework by Rod Johnson（頁面存檔備份，存於網際網路檔案館）
* The Spring Reference Documentation（頁面存檔備份，存於網際網路檔案館）（PDF，1329 kb）- Rod Johnson et al. (2004-2005)
* SpringHub （頁面存檔備份，存於網際網路檔案館）
* Domain Specific Modeling (DSM) in IoC frameworks（頁面存檔備份，存於網際網路檔案館）

## 參考資料