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版本。