什么是Spring
如果想要解釋Spring,那么最難的部分就是對其進行分類。通常情況下,Spring被描述為構建Java應用程序的輕量級框架,但這種描述帶來了兩個有趣的觀點。
首先,與許多其他框架(比如僅限於Web應用程序的Apache Struts)不同,可以使用Spring構建Java中的任何應用程序(例如,獨立的應用程序、Web應用程序或JEE應用程序)。
其次,該描述中輕量級的,因為只需要對應用程序代碼進行很少的更改(如果有的話)就可以獲得Spring Core所帶來的好處。如果想要在任何時候停止使用Spring,那么你會發現可以很容易做到。
請注意,上述描述僅針對Spring Core-許多額外的Spring組件(例如數據訪問)需要更緊密地與Spring框架耦合。然而,這種耦合的好處是非常明顯的。
Spring框架的演變
在過去十年中,Spring框架在核心功能、相關項目以及社區支持方面發展迅猛。今天就來一起快速回顧一下Spring的每個里程碑版本所帶來的重要特性,並最終發展Spring Framework5.0。
Spring 0.9
這是該框架第一個公開發布的版本,以Exper One-on-One:J2EE Design and Development一書 為基礎,提供了bean配置基礎、AOP支持、JDBC抽象框架、抽象事務支持等。該版本沒有官方參考文檔,但可以在SourceForge上找到現有的源代碼和文檔。
Spring 1.x
這是發布的第一個帶有官方參考文檔的版本。它由下圖所示的七個模塊組成。
➣ Spring Core:bean容器以及支持的實用程序。
➣ Spring Context:ApplicationContext、UI、驗證、JNDI、Enterprise JavaBean(EJB)、遠程處理和郵件支持。
➣ 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 2.x
該版本由下圖所示的六個模塊組成。現在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。
Spring 2.5.x
該版本包含以下功能。
➣ 名為@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適配器。
Spring 3.0.x
這是基於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注解、JSR303、JSF2.0、JPA2.0等。
➣ 支持嵌入式數據庫,例如HSQL、H2和Derby。
Spring 3.1.x
該版本包含以下功能。
➣ 新的緩沖對象。
➣ 可以用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 控制器方法參數。
Spring 3.2.x
該版本包含以下功能。
➣ 支持基於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 4.0.x
這是一個重要的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消息。
Spring4.2.x
該版本包含以下功能。
➣ 核心改進(例如,引入@AliaFor,並修改現有的注解以使用它)。
➣ 全面支持Hibernate ORM 5.0。
➣ JMS和Web改進。
➣ 對WebSocket消息傳遞的改進。
➣ 測試改進,最引人注目的是引入了@Commit來替換@Rollback(false),並引入AopTestUtils使用工具類,允許訪問隱藏在Spring代理后面的底層對象。
Spring 4.3.x
該版本包含以下功能。
➣ 完善了編程模型。
➣ 在核心容器(包含ASM 5.1、CGLIB 3.2.4以及spring-core.jar中的Objenesis 2.4)和MVC方面有了相當大的改進。
➣ 添加了組合注解。
➣ Spring TestContext Framework需要JUnit 4.12或更高版本。
➣ 支持新的庫,包括Hibernate ORM 5.2、Hibernate Validator 5.3、Tomcat 8.5和9.0、Jackson 2.8等。
Spring 5.x
➣ 這是一個主要版本。整個框架代碼都基於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來以不變應萬變。下次介紹核心內容的演變。