# Spring Framework
Spring框架是 Java 平台的一个开源的全栈（full-stack）应用程序框架和控制反转容器实现，一般被直接称为 Spring。该框架的一些核心功能理论上可用于任何 Java 应用，但 Spring 还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。Spring 没有直接实现任何的编程模型，但它已经在 Java 社区中广为流行，基本上完全代替了企业级JavaBeans（EJB）模型。
Spring框架以 Apache License 2.0 开源许可协议的形式发布，该框架最初由 Rod Johnson 以及 Juergen Hoeller 等人开发。

## 版本历史
| 版本 | 日期                | 描述           |
| ---- | ------------------- | -------------- |
| 0.9  | 2003                |                |
| 1.0  | March 24, 2004      | 第一個產品發布 |
| 2.0  | 2006                |                |
| 3.0  | 2009                |                |
| 4.0  | 2013                |                |
| 5.0  | 2017                |                |
| 6.0  | 2022年11月22        |                |
| 6.1  | 2023年11月16        |                |
| 6.2  | 預計發行 2024年12月 |                |

第一版由 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（页面存档备份，存于）