## 體系結構
Spring 有可能成為所有企業應用程序的一站式服務點,然而,Spring 是模塊化的,允許你挑選和選擇適用于你的模塊,不必要把剩余部分也引入。下面的部分對在 Spring 框架中所有可用的模塊給出了詳細的介紹。
Spring 框架提供約 20 個模塊,可以根據應用程序的要求來使用。

## 核心容器
核心容器由?**spring-core,spring-beans,spring-context,spring-context-support和spring-expression**(SpEL,Spring 表達式語言,Spring Expression Language)等模塊組成,它們的細節如下:
* **spring-core**模塊提供了框架的基本組成部分,包括 IoC 和依賴注入功能。
* **spring-beans**?模塊提供 BeanFactory,工廠模式的微妙實現,它移除了編碼式單例的需要,并且可以把配置和依賴從實際編碼邏輯中解耦。
* **context** 模塊建立在由?**core**和?**beans**?模塊的基礎上建立起來的,它以一種類似于 JNDI 注冊的方式訪問對象。Context 模塊繼承自 Bean 模塊,并且添加了國際化(比如,使用資源束)、事件傳播、資源加載和透明地創建上下文(比如,通過 Servelet 容器)等功能。Context 模塊也支持 Java EE 的功能,比如 EJB、JMX 和遠程調用等。**ApplicationContext?** 接口是 Context 模塊的焦點。**spring-context-support?**提供了對第三方集成到 Spring 上下文的支持,比如緩存(EhCache, Guava, JCache)、郵件(JavaMail)、調度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
* **spring-expression** 模塊提供了強大的表達式語言,用于在運行時查詢和操作對象圖。它是 JSP2.1 規范中定義的統一表達式語言的擴展,支持 set 和 get 屬性值、屬性賦值、方法調用、訪問數組集合及索引的內容、邏輯算術運算、命名變量、通過名字從 Spring IoC 容器檢索對象,還支持列表的投影、選擇以及聚合等。
它們的完整依賴關系如下圖所示:

## 數據訪問/集成
數據訪問/集成層包括 JDBC,ORM,OXM,JMS 和事務處理模塊,它們的細節如下:
(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)
* **JDBC**模塊提供了 JDBC 抽象層,它消除了冗長的 JDBC 編碼和對數據庫供應商特定錯誤代碼的解析。
* **ORM**模塊提供了對流行的對象關系映射 API 的集成,包括 JPA、JDO 和 Hibernate 等。通過此模塊可以讓這些 ORM 框架和 spring的其它功能整合,比如前面提及的事務管理。
* **OXM**模塊提供了對 OXM 實現的支持,比如 JAXB、Castor、XML?Beans、JiBX、XStream 等。
* **JMS**模塊包含生產(produce)和消費(consume)消息的功能。從 Spring?4.1 開始,集成了 spring-messaging 模塊。
* **事務**模塊為實現特殊接口類及所有的 POJO 支持編程式和聲明式事務管理。(注:編程式事務需要自己寫 beginTransaction()、commit()、rollback() 等事務管理方法,聲明式事務是通過注解或配置由 spring 自動處理,編程式事務粒度更細)
## Web
Web 層由 Web,Web-MVC,Web-Socket 和 Web-Portlet 組成,它們的細節如下:
* **Web**模塊提供面向 web 的基本功能和面向 web 的應用上下文,比如多部分(multipart)文件上傳功能、使用 Servlet 監聽器初始化 IoC 容器等。它還包括 HTTP 客戶端以及 Spring 遠程調用中與 web 相關的部分。
* **Web-MVC**模塊為 web 應用提供了模型視圖控制(MVC)和 REST?Web服務的實現。Spring 的 MVC 框架可以使領域模型代碼和 web 表單完全地分離,且可以與 Spring 框架的其它所有功能進行集成。
* **Web-Socket**模塊為 WebSocket-based 提供了支持,而且在 web 應用程序中提供了客戶端和服務器端之間通信的兩種方式。
* **Web-Portlet**模塊提供了用于 Portlet 環境的 MVC 實現,并反映了 spring-webmvc 模塊的功能。
### Test模塊
Test 模塊:Spring 支持 Junit 和 TestNG 測試框架,而且還額外提供了一些基于 Spring 的測試功能,比如在測試 Web 框架時,模擬 Http 請求的功能。
## 其他
還有其他一些重要的模塊,像[AOP](https://www.w3cschool.cn/wkspring/izae1h9w.html),Aspects,Instrumentation,Web 和測試模塊,它們的細節如下:
* **AOP**模塊提供了面向方面(切面)的編程實現,允許你定義方法攔截器和切入點對代碼進行干凈地解耦,從而使實現功能的代碼徹底的解耦出來。使用源碼級的元數據,可以用類似于.Net屬性的方式合并行為信息到代碼中。
* **Aspects**模塊提供了與**AspectJ**的集成,這是一個功能強大且成熟的面向切面編程(AOP)框架。
* **Instrumentation**模塊在一定的應用服務器中提供了類 instrumentation 的支持和類加載器的實現。
* **Messaging**模塊為 STOMP 提供了支持作為在應用程序中 WebSocket 子協議的使用。它也支持一個注解編程模型,它是為了選路和處理來自 WebSocket 客戶端的 STOMP 信息。
* **測試**模塊支持對具有 JUnit 或 TestNG 框架的 Spring 組件的測試。