Spring源碼解讀『基本概念』

Spring作爲一個優秀的開源框架,作爲一名服務端開發人員,在工作中必然是每天都要接觸的,相信每個人也都能熟練地使用Spring來完成日常工作。毫不誇張的講,Spring很大程度上改變了Java開發的方式。但是在工作中,我發現很多數人對Spring的瞭解都停留在表面,很少去深究Spring這一優秀框架底層的原理。結合我自身的體會而言,在剛開始接觸這個框架的時候,僅僅是生硬地去記它的一些使用特性,一旦遇到一些“非常規”問題,就搞不定了。隨着使用的深入,疑惑的問題越來越多(比如框架給我們帶來什麼好處?Spring、Spring MVC、Spring Boot之間有什麼聯繫?爲什麼要使用Spring MVC來啓動web項目,怎麼啓動的?工作中一直使用dubbo作爲rpc框架,往往還結合Spring一起使用,dubbo等開源框架和Spring又是什麼關係等等)。所以,從本篇文章開始,我們就來從實現上了解一下Spring。本系列計劃會從Spring、介紹Spring MVC,最後簡單介紹一下Spring Boot,中間會穿插web容器Tomcat、Servlet、JSP等概念的介紹。希望此係列文章可以爲大多數後端開發同學排憂解惑。本篇文章我們先來看一些基本概念。

1. 什麼是Spring

廣義上Spring這個詞應該指的是Spring Framework,是一個爲Java應用程序提供全方位基礎架構支持的Java平臺,爲開發者提供輕量級和簡單地編程模型。使用Spring,我們可以通過”plain old Java objects” (POJOs)來構建應用程序,並且框架不會侵入POJO。同時Spring Framework提供DI、AOP、單元測試、各種開源框架集成支持、web開發支持等功能,極大地簡化我們的編程工作。

狹義上我們往往把Spring Framework的兩個重要的屬性IOC和AOP稱爲Spring,與Spring Framework的其他模塊比如Spring MVC、Sping Boot、Spring Cloud分離開來。比如我們通常把SSM解釋爲,Spring + Spring MVC/Structs + Mybatis就是這種劃分標準。

2. Spring Framework模塊組成

Spring框架大約由20個模塊的功能組成, 這些模塊可分爲Core Container(核心容器)、Data Access(數據訪問)、Web、AOP(面向切面編程)、Instrument(檢測)、Messaging(消息)和Test(測試),如下圖所示:

2.1 Core Container(核心容器)

核心容器由spring-core、spring-beans、spring-context、spring-context-support和spring-expression(Spring表達式語言)模塊組成。

spring-core和spring-beans模塊提供了框架的基本部分,包括IOC和DI功能。 通過BeanFactory(工廠模式的複雜實現),消除了對編程單例的需求,並允許你將依賴項的配置和規範與實際程序邏輯解耦。

上下文(spring-context)模塊建立在spring-core和spring-beans模塊的基礎上,這是一種以類似於JNDI註冊中心的框架式訪問對象的方法。 spring-context繼承了spring-beans模塊的功能,並添加了對國際化(例如,使用資源束)、事件傳播、資源加載以及通過Servlet容器透明創建上下文的支持。spring-context模塊還支持Java EE功能,例如EJB、JMX和基本遠程處理。 ApplicationContext接口是spring-context模塊的焦點。 spring-context-support提供了將常見的第三方庫集成到Spring應用程序上下文中的支持,比如緩存(EhCache,JCache)和調度(CommonJ,Quartz)等。

spring-expression模塊提供了一種功能強大的表達式語言,用於在運行時查詢和操作對象,它是對JSP 2.1規範中指定的統一表達語言(統一EL)的擴展。該語言支持設置和獲取屬性值、屬性分配、方法調用、訪問數組、集合和索引器、邏輯和算術運算符、命名變量以及按名稱從Spring的IoC容器中檢索對象的內容。它還支持列表投影和選擇以及常見的列表聚合。

2.2 AOP和Instrumentation

spring-aop模塊提供了面向切面的編程實現,例如,可以定義方法攔截器和切入點,以乾淨地解耦的方式實現對業務代碼的擴展。

spring-aspects模塊提供了與AspectJ(一種AOP的實現方案,之後會介紹)的集成。

spring-instrument模塊提供了在某些應用程序服務器中使用的類檢測支持和類加載器實現。 比如spring-instrument-tomcat模塊包含用於Tomcat的Spring工具代理。

2.3 Messaging(消息)

Spring Framework 4包含一個Spring-messaging模塊,該模塊具有來自Spring Integration項目的關鍵抽象,例如Message,MessageChannel,MessageHandler等,它們充當基於消息的應用程序的基礎。 該模塊還包括一組註釋,用於將消息映射到方法,類似於基於Spring MVC註釋的編程模型。

2.4 Data Access/Integration

數據訪問/集成層由JDBC、ORM、OXM、JMS和事務模塊組成。

spring-jdbc模塊提供了JDBC抽象層,從而無需進行繁瑣的JDBC編碼和數據庫供應商特定的異常解析。

spring-tx模塊支持對實現特殊接口的類以及所有POJO(普通Java對象)進行編程和聲明式事務管理。

spring-orm模塊爲流行的對象關係映射API(包括JPA和Hibernate)提供了集成層支持。通過使用spring-orm模塊,可以將這些對象關係映射框架與Spring提供的所有其他功能結合使用,例如前面提到的簡單的聲明式事務管理功能。

spring-oxm模塊提供了一個抽象層,該抽象層支持對象/XML映射實現,例如JAXB,Castor,JiBX和XStream。

spring-jms模塊(Java Messaging Service)包含用於生成和使用消息的功能。從Spring Framework 4.1開始,它提供了與spring-messaging模塊的集成。

2.5 Web

Web層由spring-web、spring-webmvc和spring-websocket模塊組成。

spring-web模塊提供了面向Web的基本集成功能,例如多部分文件上傳功能以及使用Servlet監聽器和麪向Web的應用程序上下文對IOC容器的初始化。 它還包含HTTP客戶端和Spring遠程支持的Web相關部分。

spring-webmvc模塊(也稱爲Web-Servlet模塊)包含Spring的模型視圖控制器(MVC)和針對Web應用程序的REST Web服務實現。 Spring的MVC框架在域模型代碼和Web表單之間提供了清晰的分隔,並與Spring框架的所有其他功能集成在一起。

2.6 Test

spring-test模塊支持使用JUnit或TestNG對Spring組件進行單元測試和集成測試。 它提供了Spring ApplicationContexts的一致加載以及這些上下文的緩存。 它還提供了可用於單獨測試代碼的mock對象。

3. Spring Framework模塊依賴

上圖可以知道:

  • 如果非web項目,我們只依賴spring-context就可以快速構建起spring應用,獲得spring容器的IOC支持
  • 如果需要訪問數據庫,可直接引用spring-orm(使用hibernate/JPA),如果不使用上述持久層框架,可以引入spring-jdbc
  • 構建web應用,引入spring-webmvc即可

參考鏈接:

1. Overview of Spring Framework

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