1. 程式人生 > 實用技巧 >Spring簡介及歷史

Spring簡介及歷史

Spring簡介

Spring 在起源可以追溯到 Rod Johnson 於2002年出版的《Expert One-to-One J2EE Design and Development》一書 。在這本書中,Rod 展示了他的 interface21 框架,他為自己的應用編寫了這一框架。這一框架被髮布到開源世界後,組成了現在我們所知的 Spring 框架的基礎。
Spring 在早期的 beta 和釋出備選版本階段進行得很迅速,第一個正式版本 1.0 在 2004 年 3 月 24 日 釋出。Spring 是指一個用於構造 Java 應用程式的輕量級框架,這句話兩層意思:

  • 首先,你可以採用 Spring 來構造任何程式,這和Apache Struts 這樣的框架不同,僅僅被限定於WEB 應用
  • 其次,“輕量級”並不意味著類的數量很少,或者發行包尺寸很小。實際上,指的是Spring哲學原則——最少的侵入。

演進歷史

Spring 0.9

這是該框架第一個公開發布的版本,以Exper One-on-One:J2EE Design and Development一書 為基礎,提供了Bean配置基礎、AOP支援、JDBC抽象框架、抽象事務支援等。該版本沒有官方參考文件,但可以在SourceForge上找到原始碼和文件。

Spring 1.x

Spring釋出的第一個帶有官方參考文件(從Spring 1.1.1開始)的版本。主要由七個模組組成
在這裡插入圖片描述

  • Core:框架的最基本部分,提供依賴注入使你可以管理Bean容器。
  • DAO:提供了JDBC抽象層,從而無需進行繁瑣的JDBC編碼和資料庫特定錯誤程式碼的解析。JDBC包不僅為實現特殊介面的類,而且為所有POJO(普通Java物件)提供了一種程式設計以及宣告式的事務管理。
  • Context:ApplicationContext、UI、驗證、JNDI、Enterprise JavaBean(EJB)、遠端處理和郵件支援。
  • ORM:為流行的物件關係對映API(包括JDO,Hibernate和iBatis)提供了整合支援。
  • AOP:提供AOP Alliance相容的面向切面的程式設計實現。
  • Web:提供了基本的面向Web的整合功能,如:使用Servlet偵聽器初始化上下文以及面向Web的應用程式上下文。
  • Web MVC:為Web應用程式提供了Model-View-Controller(MVC)實現。

Spring 2.x

在這裡插入圖片描述

  • 增加了對國際化(i18n),事件傳播,資源載入以及通過Servlet容器透明建立上下文的支援。
  • 通過使用新的基於XML Schema的配置而不是DTO格式來簡化XML配置。值得注意的改進方面包括bean定義、AOP以及宣告式事務。
  • 用於Web和門戶的新bean作用域(請求、會話和全域性會話)。
  • 支援AOP開發的@AspectJ註解。
  • Java Persistence API(JPA)抽象層。
  • 完全支援非同步JMS訊息驅動的POJO(用於普通的舊Java物件)。
  • JDBC簡化包括在使用Java5+時的SimpleJdbcTemplate。
  • JDBC命名引數支援(NamedParameterJdbcTemplate)。
  • 針對Spring MVC的表單標籤庫。
  • 對Porlet MVC框架的介紹。
  • 動態語言支援。可以使用JRuby、Groovy以及BeanShell來編寫bean。
  • JMX中的通知支援以及可控的MBean註冊。
  • 為排程任務而引入的TaskExecutor註冊。
  • 為排程任務而引入的TaskExecutor抽象。
  • Java註解支援,特別針對@Transactional、@Required和@AspectJ。

Spring 2.5

  • 引入@Autowired 註解及對JSR-250註解(@Resource、@PostConstruct和PreDestroy)的支援。
  • 引入新的構造型註解:@Component、@Repository、@Service、和@Controller。
  • 自動類路徑掃描支援,可以檢測和連線帶有構造型註解的類。
  • AOP更新,包括一個新的Bean切入點元素以及AspectJ載入時織入(weaving)。
  • 支援完整的WebSphere事務管理。
  • 除了[email protected]註解,還添加了@RequestMapping、@RequestParam和@ModelAttribure註解,從而支援通過註解配置進行請求處理。
  • 支援Tiles2。
  • 支援JSF1.2。
  • 支援JAX-WS2.0/2.1。
  • 引入了Spring TestContext Framework,提供註解驅動和整合測試支援,不受所用測試框架的影響。

Spring 3.x

Spring 基於Java5的第一個版本,旨在充分利用Java5的功能,如泛型、可變引數和其他語言改進。該版本引入了基於Java的@Configuration模型。
在這裡插入圖片描述

  • 支援Java5功能,例如泛型、可變引數以及其他改進。
  • 對Callables、Futures、ExceutoService介面卡和ThreadFactory整合提供很好的支援。
  • 框架模組目前針對每個模組JAR都使用一課原始碼樹進行分別管理。
  • Spring Expression Language(SpEL)的引入。
  • 核心Java Config功能和註解的整合。
  • 通用型轉換系統和欄位格式化系統。
  • 全面支援REST。
  • 新的MVC XML名稱空間和其他註解,例如Spring MVC中的@CookieValue和@RequestHeaders。
  • 驗證增強功能和JSR-303(bean驗證)支援。
  • 對JavaEE6的早期支援,包括@Async/@Asynchronous註解、JSR303、JSF2.0、JPA2.0等。
  • 支援嵌入式資料庫,例如HSQL、H2和Derby。

Spring 4.x

Spring第一個完全支援Java 8的版本。雖然仍然可以使用較舊版本的Java,但Java SE6已經提出了最低版本要求。啟用的類和方法已經被刪除,但模組組織幾乎相同。
在這裡插入圖片描述

  • 從先前的Spring 3 版本中刪除棄用的軟體包和方法。
  • 支援Java8,將最低Java版本提高到6 update 18。
  • Java EE6 及以上版本現在被認為是Spring Framework 4.0的基準。
  • Groovy bean定義DSL,允許通過Goovy語法配置bean定義。
  • 核心容器、測試和一般web改進。
  • WebSocket、SocJS、和STOMP訊息。

Spring 5.x

整個框架程式碼都基於Java 8,並且自2016年7月起與Java 9完全相容。

  • 充分利用Java 8 的強大功能,從而在效能上得到極大的改進。
  • 支援Portlet、Veloctiy、JaspReports、XMLBeans、JDO、Guava、Tiles 2和Hibernate 3。
  • 現在XML 配置名稱空間被流式傳輸到未版本化的模式;雖然特定版本的宣告仍然被支援,但要針對最新的XSD架構進行驗證。
  • Resource 抽象為防禦 getFile 訪問提供了isFile指示符。
  • Spring 提供的Filter實現完全支援Servlet 3.1簽名。
  • 支援 Protobuf 3.0。
  • 支援JMS 2.0+和JPA 2.0+。
  • 引入了Spring Web Flow,這是一個用於替代Spring MVC的專案,構建在反應式基礎之上,這意味著他完全是非同步和非阻塞的,主要使用者事件迴圈執行模型,而非傳統的每個請求執行模式都帶有一個執行緒的大型執行緒池(基於Project Reactor構建)。
  • Web 和核心模組適用於反應式程式設計模型。
  • Spring 測試模組有了很大的改進。現在支援JUnit 5,引入了新的註解來支援 Jupiter 程式設計和擴充套件模型,例如@SpringUnitConfig、@SpringJUnitWebConfig、@EnabledIf和@DisabledIf。
  • 支援在 Spring TestContext Framework 中實現並行測試執行。

Spring體系結構

在這裡插入圖片描述

Core Container(核心容器)

該模組主要包含Core、Beans、Context和SpEL模組。其中Core和Beans是整個框架最基礎的部分,提供IOC和依賴注入特性。這裡最重要的概念就是BeanFactory,提供了以Factory模式的實現來消除對程式性單例模式。

  • Core:模組主要包含Spring框架最基本的核心工具類,Core是其他元件的基礎核心。
  • Beans:模組主要包含訪問配置檔案、建立/管理Bean以及IOC/DI相關的類。
  • Context:繼承了Beans的特性,主要為Spring提供大量的擴充套件,如國際化、事件機制、資源載入等待。ApplicationContext介面是Context模組的關鍵。
  • SpEL:模組提供了一個強大的語言表示式。

AOP and Instrumentation

提供符合AOP Alliance標準的面向切面程式設計的實現,可以讓你定義如方法攔截器和切點,從而降低程式之間的耦合性。

  • AspectJ模組提供了與AspectJ的整合 。
  • Instrumentation模組提供用於某些應用程式伺服器的類工具支援和類載入器實現 。

Messaging

該模組具有來自Spring Integration專案的關鍵抽象,如Message,MessageChannel,MessageHandler等。它們構成基於訊息的應用程式的基礎。該模組還包括一組註釋,用於將訊息對映到方法,類似於基於Spring MVC註釋的程式設計模型。

Data Access/Integration

資料訪問/整合層由JDBC,ORM,OXM,JMS和事務模組組成。

  • JDBC模組提供了JDBC抽象層,從而無需進行繁瑣的JDBC編碼和資料庫特定錯誤程式碼(不同資料程式碼可能不同)的解析。
  • 事務模組支援對實現特殊介面的類以及所有POJO(普通Java物件)進行程式設計和宣告式事務管理。
  • 該模組為當前流行的ORM(包括JPA,JDO和Hibernate)提供了整合層。使用ORM模組,可以將所有這些O/R對映框架與Spring提供的所有功能結合使用,如前面提到的事務管理功能。
  • OXM模組提供了一個抽象層,該抽象層支援Object/ XML對映實現,例如JAXB,Castor,XMLBeans,JiBX和XStream。
  • JMS模組(Java Messaging Service)包含用於生成和使用訊息的功能。從Spring Framework 4.1開始,提供了與Spring-Messaging模組整合。

Web

Web上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供上下文支援。該模組包含Web、WebMVC、Web Socket和Web-Porlet模組。

  • Web模組提供了基本的面向Web的整合功能,如檔案上傳功能以及使用Servlet監聽器和麵向Web的應用程式上下文對IoC容器的初始化。
  • WebMVC模組(也稱為Web-Servlet模組)包含基於Spring的Model-View-Controller(MVC)支援和針對Web應用程式的Rest Web服務實現。
  • Web-Portlet 模組(也稱為Web-Portlet模組)提供Portlet環境中的MVC實現。

Test

該模組支援使用JUnit或TestNG對Spring元件進行單元測試和整合測試。

Spring模組依賴關係圖

在這裡插入圖片描述

Spring5新特性

  • 整個框架的程式碼基於Java8
  • 通過使用泛型等特性提高可讀性
  • 對Java8提高直接的程式碼支撐
  • 執行時相容JDK9
  • Java EE 7API需要Spring相關的模組支援
  • 執行時相容Java EE8 API
  • 取消了一些包、類和方法
    ○ 包 beans.factory.access
    ○ 包 dbc.support.nativejdbc
    ○ 模組移除了包mock.staicmock,不再提供AnnotationDrivenStaticEntityMockingControl支援
    ○ 許多不建議使用的類和方法在程式碼庫中刪除

核心特性

JDK8的增強:

  • 訪問Resuouce時提供getFile或和isFile防禦式抽象
  • 有效的方法引數訪問基於Java 8反射增強
  • 在Spring核心介面中增加了宣告default方法的支援一貫使用JDK7 Charset和StandardCharsets的增強
  • 相容JDK9
  • Spring 5.0框架自帶了通用的日誌封裝
  • 持續例項化via建構函式(修改了異常處理)
  • spring-jcl替代了通用的日誌,仍然支援可重寫
  • 自動檢測log4j 2.x, SLF4J, JUL(java.util.Logging)而不是其他的支援
  • 訪問Resuouce時提供getFile或和isFile防禦式抽象
  • 基於NIO的readableChannel也提供了這個新特性

核心容器

  • 支援候選元件索引(也可以支援環境變數掃描)
  • 支援@Nullable註解
  • 函式式風格GenericApplicationContext/AnnotationConfigApplicationContext
  • 基本支援Bean API註冊
  • 在介面層面使用CGLIB動態代理的時候,提供事物,快取,非同步註解檢測
  • XML配置作用域流式
  • Spring WebMVC
  • 全部的Servlet 3.1 簽名支援在Spring-provied Filter實現
  • 在Spring MVC Controller方法裡支援Servlet4.0 PushBuilder引數
  • 多個不可變物件的資料繫結(Kotlin/Lombok/@ConstructorPorties)
  • 支援Jackson2.9
  • 支援JSON繫結API
  • 支援protobuf3
  • 支援Reactor3.1 Flux和Mono

SpringWebFlux

  • 新的Spring-webflux模組,一個基於Reactive的Spring-webmvc,完全的非同步非阻塞,旨在使用enent-loop執行模型和傳統的執行緒池模型。
  • Reactive說明在spring-core比如編碼和解碼。
  • Spring-core相關的基礎設施,比如Encode 和Decoder可以用來編碼和解碼資料流;DataBuffer 可以使用java ByteBuffer或者Netty ByteBuf;ReactiveAdapterRegistry可以對相關的庫提供傳輸層支援。
  • 在Spring-web包裡包含HttpMessageReade和HttpMessageWrite。

測試方面的改進

  • 完成了對JUnit 5’s Juptier程式設計和拓展模組在Spring TestContext框架。
  • SpringExtension:是JUnit多個可拓展API的一個實現,提供了對現存Spring TestContext Framework的支援,使用@ExtendWith(SpringExtension.class)註解引用。
  • @SpringJunitConfig:一個複合註解。
  • @ExtendWith(SpringExtension.class) 來源於Junit Jupit。
  • @ContextConfiguration 來源於Srping TestContext框架。
  • @DisabledIf 如果提供的該屬性值為true的表達或佔位符,訊號:註解的測試類或測試方法被禁用。
  • 在Spring TestContext框架中支援並行測試。
  • 具體細節檢視Test 章節 通過SpringRunner在Sring TestContext框架中支援TestNG, Junit5,新的執行之前和之後測試回撥。
  • 在testexecutionlistener API和testcontextmanager新beforetestexecution()和aftertestexecution()回撥。MockHttpServletRequest新增了getContentAsByteArray()和getContentAsString()方法來訪問請求體。
  • 如果字元編碼被設定為mock請求,在print()和log()方法中可以列印Spring MVC Test的redirectedUrl()和forwardedUrl()方法支援帶變量表達式URL模板。
  • XMLUnit 升級到了2.3版本。