若是想要解釋Spring,那麼最難的部分就是對其進行分類。一般狀況下,Spring被描述爲構建Java應用程序的輕量級框架,但這種描述帶來了兩個有趣的觀點。git
首先,與許多其餘框架(好比僅限於Web應用程序的Apache Struts)不一樣,可使用Spring構建Java中的任何應用程序(例如,獨立的應用程序、Web應用程序或JEE應用程序)。github
其次,該描述中輕量級的,由於只須要對應用程序代碼進行不多的更改(若是有的話)就能夠得到Spring Core所帶來的好處。若是想要在任什麼時候候中止使用Spring,那麼你會發現能夠很容易作到。web
請注意,上述描述僅針對Spring Core-許多額外的Spring組件(例如數據訪問)須要更緊密地與Spring框架耦合。然而,這種耦合的好處是很是明顯的。spring
在過去十年中,Spring框架在覈心功能、相關項目以及社區支持方面發展迅猛。今天就來一塊兒快速回顧一下Spring的每一個里程碑版本所帶來的重要特性,並最終發展Spring Framework5.0。數據庫
這是該框架第一個公開發布的版本,以Exper One-on-One:J2EE Design and Development一書 爲基礎,提供了bean配置基礎、AOP支持、JDBC抽象框架、抽象事務支持等。該版本沒有官方參考文檔,但能夠在SourceForge上找到現有的源代碼和文檔。編程
這是發佈的第一個帶有官方參考文檔的版本。它由下圖所示的七個模塊組成。架構
➣ Spring Core:bean容器以及支持的實用程序。併發
➣ Spring Context:ApplicationContext、UI、驗證、JNDI、Enterprise JavaBean(EJB)、遠程處理和郵件支持。app
➣ Spring ORM:Hibernate、iBATIS和Java Data Object(JDO)支持。框架
➣ Spring AOP:符合AOP聯盟的面向方面編程(AOP)實現。
➣ Spring Web:基本集成功能,好比多部分功能、經過servlet偵聽器進行上下文初始化以及面向Web的應用程序上下文。
➣ Spring Web MVC:基於Web 的Model-View-Controller(MVC)框架。
該版本由下圖所示的六個模塊組成。如今Spring Context模塊包含在Spring Core中,而在Spring 2.x 版本中,全部的Spring Web組件都由單個項目表示。
➣ 經過使用心得基於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。
該版本包含如下功能。
➣ 名爲@Autowired 的新配置註解以及對JSR-250註解(@Resource、@PostConstruct和PreDestroy)支持。
➣ 新的構造型註解:@Component、@Repository、@Service、和@Controller。
➣ 自動類路徑掃描支持,能夠檢測和鏈接帶有構造型註解的類。
➣ AOP更新,包括一個新的bean切入點元素以及AspectJ加載時織入(weaving)。
➣ 完整的WebSphere事務管理支持。
➣ 除了SpringMVC@Controller註解,還添加了@RequestMapping、@RequestParam和@ModelAttribure註解,從而支持經過註解配置進行請求處理。
➣ 支持Tiles2。
➣ 支持JSF1.2。
➣ 支持JAX-WS2.0/2.1。
➣ 引入了Spring TestContext Framework,提供註解驅動和集成測試支持,不受所用測試框架的影響。
➣ 可以將Spring應用程序上下文部署爲JCA適配器。
這是基於Java5的第一個版本,旨在充分利用Java5的功能,如泛型、可變參數和其餘語言改進。該版本引入了基於Java的@Configuration模型。目前已經對框架模塊進行了修改,分別針對每一個模塊JAR使用一棵源代碼樹進行管理。
以下圖所示的抽象描述
➣ 支持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註解、JSR30三、JSF2.0、JPA2.0等。
➣ 支持嵌入式數據庫,例如HSQL、H2和Derby。
該版本包含如下功能。
➣ 新的緩衝對象。
➣ 能夠用XML定義bean定義配置文件,同時也支持@Profile註解。
➣ 針對統一屬性管理的環境抽象。
➣ 與常見Spring XML名稱空間元素等價的註解,如@ComponentScan、@EnableTransationManagement、@EnableCaching、@EnableScheduling、@EnableAsync、@EnableAspectAutoProxy、@EnableLoadTimeWeaving和@EnableSpringConfigured。
➣ 支持Hibernate 4。
➣ Spring TestContext Framework對@Configuration類和bean定義配置文件的支持。
➣ 名稱空間 c:簡化了構造函數注入。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="bar" class="x.y.Bar"/> <bean id="baz" class="x.y.Baz"/> <-- 'traditional' declaration --> <bean id="foo" class="x.y.Foo"> <constructor-arg ref="bar"/> <constructor-arg ref="baz"/> <constructor-arg value="foo@bar.com"/> </bean> <-- 'c-namespace' declaration --> <bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"> </beans>
➣ 支持Servlet 3中Servlet容器的基於代碼的配置。
➣ 可以在不使用persistence.xml的狀況下啓動JPA EntityManagerFactory。
➣ 將Flash和RedirectAttributes添加到Spring MVC中,從而容許經過使用HTTP會話重定向屬性。
➣ URI模板變量加強功能。
➣ 可以使用@Valid來註解Spring MVC @RequestBody 控制器方法參數。
➣ 可以使用@RequestPart來註解Spring MVC 控制器方法參數。
該版本包含如下功能。
➣ 支持基於Servlet 3的一步請求處理。
➣ 新的Spring MVC 測試框架。
➣ 新的Spring MVC 註解@ControllerAdvice 和 @Matrix Variable。
➣ 支持RestTemplate和@RequestBody參數中泛型類型。
➣ 支持Jackson JSON2。
➣ 支持Tiles 3。
➣ 如今,@RequestBody或@RequestPart參數的後面能夠跟着一個Errors參數,從而能夠對驗證錯誤進行處理。
➣ 可以經過使用MVC名稱空間和Java Config 配置選項來排除URL模式。
➣ 支持沒有Joda Time的@DateTimeFormat.
➣ 全局日期和時間格式化。
➣ 跨框架的併發優化,從而最小化鎖定,並改進了做用域/原型bean的併發建立。
➣ 新的機遇Gradle的構建系統。
➣ 遷移到Github(https://github.com/spring-projects/spring-framework)。
➣ 在框架和第三方依賴中支持精簡的Java SE7/OpenJDK 7。如今,CGLIB和ASM已經成爲Spring的一部分。除了AspectJ1.6,其餘版本都支持AspectJ 1.7。
這是一個重要的Spring版本,也是第一個徹底支持Java 8的版本。雖然仍然可使用較舊版本的Java,但Java SE6已經提出了最低版本要求。啓用的類和方法已經被刪除,但模塊組織幾乎相同。
以下圖所示
➣ 經過 www.spring.io/guides 網站上的一系列入門指南提升了入門體驗。
➣ 從先前的Spring 3 版本中刪除棄用的軟件包和方法。
➣ 支持Java8,將最低Java版本提升到6 update 18。
➣ Java EE6 及以上版本如今被認爲是Spring Framework 4.0的基準。
➣ Groovy bean定義DSL,容許經過Goovy語法配置bean定義。
➣ 核心容器、測試和通常web改進。
➣ WebSocket、SocJS、和STOMP消息。
該版本包含如下功能。
➣ 核心改進(例如,引入@AliaFor,並修改現有的註解以使用它)。
➣ 全面支持Hibernate ORM 5.0。
➣ JMS和Web改進。
➣ 對WebSocket消息傳遞的改進。
➣ 測試改進,最引人注目的是引入了@Commit來替換@Rollback(false),並引入AopTestUtils使用工具類,容許訪問隱藏在Spring代理後面的底層對象。
該版本包含如下功能。
➣ 完善了編程模型。
➣ 在覈心容器(包含ASM 5.一、CGLIB 3.2.4以及spring-core.jar中的Objenesis 2.4)和MVC方面有了至關大的改進。
➣ 添加了組合註解。
➣ Spring TestContext Framework須要JUnit 4.12或更高版本。
➣ 支持新的庫,包括Hibernate ORM 5.二、Hibernate Validator 5.三、Tomcat 8.5和9.0、Jackson 2.8等。
➣ 這是一個主要版本。整個框架代碼都基於Java 8,而且自2016年7月起與Java 9徹底兼容。
➣ 支持Portlet、Veloctiy、JaspReports、XMLBeans、JDO、Guava、Tiles 2和Hibernate 3。
➣ 如今XML 配置名稱空間被流式傳輸到未版本化的模式;雖然特定版本的聲明仍然被支持,但要針對最新的XSD架構進行驗證。
➣ 充分利用Java 8 的強大功能,從而在性能上獲得極大的改進。
➣ 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 框架雖然在不斷的演變,可是核心的原理尚未太大變化的。用IOC或DI來以不變應萬變。下次介紹核心內容的演變。