2、Spring 的體系架構——未完成
Spring
的系統架構
Spring
總共大約有 20 個模組
,由 1300
多個不同的檔案構成。而這些元件被分別整合在核心容器 (Core Container)
、AOP(Aspect Oriented Programming)
、Aspects
和裝置支援(Instrmentation)
、
資料訪問及整合(Data Access/Integeration)
、Web
、報文傳送(Messaging)
、Test
,8個模組
集合中。以下是 Spring 5.x
的模組結構圖:
組成 Spring
框架的每個模組集合或者模組都可以單獨存在, 也可以一個或多個模組聯合實現。 每個模組的組成和功能如下:
1、核心容器:由 spring-beans
、spring-core
、spring-context
和 spring-expression(Spring Expression Language, SpEL)
4 個模組組成。
spring-beans
和 spring-core
模組是 Spring 框架
的核心模組,包含了控制反轉(Inversion of Control, IOC)
和依賴注入(Dependency Injection, DI)
。BeanFactory 介面
是 Spring 框架
中 的核心介面,它是工廠模式的具體實現。BeanFactory
使用控制反轉對應用程式的配置和依賴性規範與 實際的應用程式程式碼進行了分離。但 BeanFactory
Bean
,只有當 Bean
被使用時 BeanFactory
容器才會對該Bean
進行例項化與依賴關係的裝配。
spring-context
模組構架於核心模組之上,他擴充套件了BeanFactory
,為她添加了Bean
生命週期控制、框架事件體系以及資源載入透明化等功能。此外該模組還提供了許多企業級支援,如郵件訪問、 遠端訪問、任務排程等,ApplicationContext
是該模組的核心介面,她是 BeanFactory
的超類,與BeanFactory
不同,ApplicationContext
容器例項化後會自動對所有的單例項 Bean
進行例項化與依賴關係的裝配,使之處於待用狀態。
spring-expression
模組是統一表示式語言(EL)
的擴充套件模組,可以查詢、管理執行中的物件, 同時也方便的可以呼叫物件方法、運算元組、集合等。它的語法類似於傳統 EL,但提供了額外的功能,最出色的要數函式呼叫和簡單字串的模板函式。這種語言的特性是基於Spring
產品的需求而設計,他可以非常方便地同 Spring IOC
進行互動。
2、AOP
和裝置支援
:由 spring-aop
、spring-aspects
和 spring-instrument
3 個模組組成。
spring-aop
是 Spring
的另一個核心模組,是 AOP
主要的實現模組。作為繼 OOP
後,對程式設計師影 響最大的程式設計思想之一,AOP
極大地開拓了人們對於程式設計的思路。在 Spring
中,他是以 JVM
的動態代 理技術為基礎,然後設計出了一系列的 AOP
橫切實現,比如前置通知、返回通知、異常通知等,同時, Pointcut
介面來匹配切入點,可以使用現有的切入點來設計橫切面,也可以擴充套件相關方法根據需求進 行切入。
spring-aspects 模組
整合自 AspectJ 框架
,主要是為 Spring AOP
提供多種 AOP
實現方法。
spring-instrument
模組是基於 JAVA SE
中的java.lang.instrument
進行設計的,應該算是AOP
的一個支援模組,主要作用是在 JVM
啟用時,生成一個代理類,程式設計師通過代理類在執行時修改類的位元組,從而改變一個類的功能,實現 AOP
的功能。在分類裡,我把他分在了 AOP
模組下,在 Spring
官 方文件裡對這個地方也有點含糊不清,這裡是純個人觀點。
3、資料訪問及整合:由spring-jdbc
、spring-tx
、spring-orm
、spring-jms
和 spring-oxm
5 個模組組成。
spring-jdbc 模組
是 Spring
提供的 JDBC
抽象框架的主要實現模組,用於簡化 Spring JDBC
。主要是提供 JDBC 模板方式
、關係資料庫物件化方式
、SimpleJdbc 方式
、事務管理來簡化 JDBC 程式設計
,主要實現類是 JdbcTemplate
、SimpleJdbcTemplate
以及 NamedParameterJdbcTemplate
。
spring-tx 模組
是 Spring JDBC
事務控制實現模組。使用 Spring 框架
,它對事務做了很好的封裝,通過它的 AOP
配置,可以靈活的配置在任何一層;但是在很多的需求和應用,直接使用 JDBC 事務控制
還是有其優勢的。其實,事務是以業務邏輯為基礎的;一個完整的業務應該對應業務層裡的一個方法; 如果業務操作失敗,則整個事務回滾;所以,事務控制是絕對應該放在業務層的;但是,持久層的設計則應該遵循一個很重要的原則:保證操作的原子性,即持久層裡的每個方法都應該是不可以分割的。所以,在使用 Spring JDBC
事務控制時,應該注意其特殊性。
spring-orm 模組
是 ORM 框架
支援模組,主要整合Hibernate
、Java Persistence API (JPA)
和Java Data Objects (JDO)
用於資源管理、資料訪問物件(DAO
)的實現和事務策略。
spring-jms 模組(Java Messaging Service)
能夠傳送和接受資訊,自 Spring Framework 4.1
以後,他還提供了對 spring-messaging 模組
的支撐。
spring-oxm 模組
主要提供一個抽象層以支撐OXM(OXM 是 Object-to-XML-Mapping 的縮寫,它是一個 O/M-mapper,將 java 物件對映成 XML 資料,或者將 XML 資料對映成 java 物件)
,例如:JAXB
、Castor
、XMLBeans
、JiBX
和 XStream
等。
4、Web
:由 spring-web
、spring-webmvc
、spring-websocket
和 spring-webflux
4 個模組組成.
spring-web 模組
為 Spring
提供了最基礎 Web
支援,主要建立於核心容器之上,通過 Servlet
或者 Listeners
來初始化IOC 容器
,也包含一些與 Web
相關的支援。
spring-webmvc 模 塊
眾 所 周 知 是 一 個 的 Web-Servlet 模 塊
, 實 現 了 Spring MVC(model-view-Controller)
的Web
應用。
spring-websocket 模組
主要是與 Web 前端
的全雙工通訊的協議。(資料缺乏,這是個人理解)
spring-webflux
是一個新的非堵塞函式式 Reactive Web 框架
,可以用來建立非同步的,非阻塞,事件驅動的服務,並且擴充套件性非常好。
5、報文傳送:即 spring-messaging 模組
。
spring-messaging
是從 Spring 4
開始新加入的一個模組,主要職責是為 Spring 框架
整合一些基礎的報文傳送應用。
6、Test
:即 spring-test 模組
。
spring-test 模組
主要為測試提供支援的,畢竟在不需要釋出(程式)到你的應用伺服器或者連線到其他企業設施的情況下能夠執行一些整合測試或者其他測試對於任何企業都是非常重要的。
7、Spirng
各模組之間的依賴關係
該圖是 Spring 5
的包結構,可以從中清楚看出 Spring
各個模組之間的依賴關係。
如果想學習 Spring 原始碼
的學習,建議是從 spring-core 入手,其次是 spring-beans 和
spring-aop,隨後是 spring-context,再其次是 spring-tx 和 spring-orm,最後是 spring-web和其他部分。