第二部分 Spring Framework 4.x中有什么新功能?
3. Spring Framework 4.0中的新功能和增強功能
Spring框架于2004年首次發布; 從發布至今,已經有了較大的更改:Spring 2.0提供了XML命名空間和AspectJ支持; Spring 2.5采用注釋驅動配置; Spring 3.0在框架代碼庫中引入了強大的Java 5+基礎,以及基于Java的@Configuration
模型等功能。
版本4.0是Spring Framework的最新版本,也是第一個完全支持Java 8功能的版本。您仍然可以使用Spring與舊版本的Java,但是,最低要求已經提升到Java SE 6.我們還利用主要版本的機會刪除了許多不推薦的類和方法。
可以在Spring框架的GitHub參考上查看項目升級到Spring4.0的指南。
3.1改進入門經驗
新的spring.io網站提供了一整套 “入門指南”,幫助您學習Spring。您可以在本文檔的第1 章“入門指南”部分閱讀有關指南的更多信息。新網站還全面概述了Spring范圍內發布的許多其他項目。
如果您是Maven用戶,您可能還會對每個Spring 框架Release
版本最新發布的POM物料清單感興趣。
3.2刪除已棄用的軟件包和方法
所有已棄用的軟件包以及許多不推薦使用的類和方法,均已經從版本4.0中刪除。如果您從以前版本的Spring升級,您應該確保您已經修復了對過期的API所做的任何已棄用的調用。
有關完整的更改,請查看API差異報告。
請注意,可選的第三方依賴關系已經提升到2010/2011最低限度(即Spring 4通常只支持2010年底或更晚版本發布的版本):特別是Hibernate 3.6+,EhCache 2.1+,Quartz 1.8+,Groovy 1.8+和Joda-Time 2.0+。作為規則的一個例外,Spring 4需要最近的Hibernate Validator 4.3+,并且對Jackson的支持已經集中在2.0+以上(Jackson 2.8 / 1.9支持保留在Spring 3.2的時候),現在只是不贊成的形式)。
3.3 Java 8(以及6和7)
Spring Framework 4.0支持多種Java 8功能。您可以使用帶有Spring的回調接口的 lambda表達式和方法引用。對java.time
(JSR-310)有一流的支持,并且幾個現有的注釋已經被改裝為@Repeatable
。您還可以使用Java 8的參數名稱發現(基于-parameters
編譯器標志)作為在啟用調試信息的情況下編譯代碼的替代方法。
Spring與舊版本的Java和JDK兼容:具體來說,對Java SE 6(具體來說,與2010年1月發布的JDK 6更新18的最低等級相同)及以上版本仍然完全支持。但是,對于基于Spring 4的新開發項目,我們建議使用Java 7或8。
3.4 Java EE 6和7
Java EE 6+及其相關的JPA 2.0和Servlet 3.0,被認為是Spring 4的基準。為了與Google App Engine和較舊的應用服務器保持兼容,可以將Spring 4應用程序部署到Servlet 2.5環境中。但是,強烈建議部署環境使用Servlet 3.0+,這是測試設置的Spring和模擬軟件開發環境的先決條件。
如果您是WebSphere 7用戶,請確保安裝JPA 2.0功能包。在WebLogic 10.3.4或更高版本上,安裝隨附的JPA 2.0修補程序。這可以把這兩個服務器代碼轉變成Spring 4兼容的部署環境。
在更前瞻性的筆記中,Spring Framework 4.0現在支持Java EE 7級別的適用規范:特別是JMS 2.0,JTA 1.2,JPA 2.1,Bean Validation 1.1和JSR-236并發實用程序。像往常一樣,這種支持側重于個人使用這些規范,例如在Tomcat或獨立環境中。但是,當將Spring應用程序部署到Java EE 7服務器時,它的工作效果同樣好。
請注意,Hibernate 4.3是一個JPA 2.1的提供者,因此僅支持Spring Framework 4.0。同樣適用于Hibernate Validator 5.0作為Bean Validation 1.1的提供者。因此,Spring Framework 3.2不支持這兩種程序。
3.5 Groovy Bean定義DSL
從Spring Framework 4.0開始,可以使用Groovy DSL定義外部bean配置。這在概念上類似于使用XML bean定義,但允許更簡潔的語法。使用Groovy還可以方便地將bean定義直接嵌入到引導代碼中。例如:
def reader = new GroovyBeanDefinitionReader(myApplicationContext)
reader.beans {
dataSource(BasicDataSource) {
driverClassName = "org.hsqldb.jdbcDriver"
url = "jdbc:hsqldb:mem:grailsDB"
username = "sa"
password = ""
settings = [mynew:"setting"]
}
sessionFactory(SessionFactory) {
dataSource = dataSource
}
myService(MyService) {
nestedBean = { AnotherBean bean ->
dataSource = dataSource
}
}
}
有關更多信息,請查閱GroovyBeanDefinitionReader
javadoc。
3.6 核心集裝箱改造
對核心容器進行了如下改進:
- 當注入Bean時,Spring把泛型當作限定符。如果您使用Spring的Repository時,可以輕松地注入特定的實現,例如:
@Autowired Repository<Customer> customerRepository
。 - 使用Spring的元注解,可以開發暴露特定屬性的自定義注解。
- Bean可以在被裝配到list或數組中時排好序。通過
@Order
注解和Ordered
接口支持。 -
@Lazy
注解可以用于注入點,也可用于@Bean
定義上。 - 引入了
@Description
注解以便開發者使用基于Java的配置。 - 通過
@Conditional
注解可以定義有條件過濾的bean。這與@Profile
類似但允許用戶自定義開發策略。 - 基于CGLIB的代理類不再需要默認的構造方法。通過objenesis庫進行支持,它被重新打包到Spring中并作為Spring框架的一部分發布。使用這種策略,生成代理實例時沒有構造方法將被調用。
- 添加了管理時區的支持。例如
LocaleContext
。
3.7一般Web改進
Spring Framework 4.0仍然可以部署到Servlet 2.5服務器,但現在的部署環境已經主要集中在Servlet 3.0+環境上了。如果您使用 Spring MVC測試框架,則需要確保Servlet 3.0兼容的JAR位于測試類路徑中。
除了稍后提到的WebSocket
支持外,Spring的Web模塊還進行了以下一般性的改進:
- 您可以在Spring MVC應用程序中使用新的
@RestController
注釋,這樣就不需要添加@ResponseBody
到每個@RequestMapping
方法中。 - 新增了
AsyncRestTemplate
類,支持開發REST客戶端時實現異步非阻塞。 - 在開發Spring MVC應用程序時,Spring會提供全面的時區支持。
3.8 WebSocket,SockJS和STOMP消息傳遞
新的spring-websocket
模塊為Web應用程序中的客戶端和服務器之間的基于WebSocket
的雙向通信提供了全面的支持。它與 JSR-356、Java WebSocket API兼容,此外還提供了基于SockJS的后備選項(即WebSocket仿真),用于尚不支持WebSocket協議的瀏覽器(例如Internet Explorer <10)。
新的spring-messaging
模塊增加了對STOMP的支持,作為應用中的WebSocket子協議以及用于從WebSocket客戶端路由和處理STOMP消息的注釋編程模型。其結果是一個@Controller
現在可以同時包含@RequestMapping
和@MessageMapping
方法用于從網頁套接字連接的客戶端處理HTTP請求和消息。新的spring-messaging
模塊還包含關鍵的抽象概念,以前多由 Spring集成項目,例如Message
,MessageChannel
,MessageHandler
,和其他人作為基于消息的應用奠定了基礎。
有關更多詳細信息,包括更全面的介紹,請參閱第26章WebSocket支持部分。
3.9測試改進
除了在spring-test
模塊中修剪已棄用的代碼之外,Spring Framework 4.0還引入了用于單元和集成測試的幾個新功能。
spring-test
模塊中的幾乎所有注釋(例如,@ContextConfiguration
, @WebAppConfiguration
,@ContextHierarchy
,@ActiveProfiles
,等),現在可以被用作元注釋來創建自定義組成的注解和減少整個測試套件構造重復。
活動bean定義配置文件現在可以通過編程方式解決,只需通過實現自定義ActiveProfilesResolver
并通過@ActiveProfiles
注冊resolver
屬性即可。
在spring-core
模塊中引入了新的SocketUtils
類,可以在本地主機上掃描空閑的TCP和UDP服務器端口。此功能不是專門用于測試,但在編寫需要使用套接字的集成測試(例如啟動內存中的SMTP服務器,FTP服務器,Servlet容器等)時,可能會非常有用。
從Spring 4.0開始,org.springframework.mock.web
中的mocks
設置,變更為基于Servlet 3.0 API。此外,若干在Servlet API mocks
(例如,MockHttpServletRequest
,MockServletContext
等等)已被更新了少量的增強部分,并且改進其可配置性。
4. Spring框架4.1中的新功能和增強功能
4.1 JMS改進
Spring 4.1引入了一個更簡單的基礎設置,通過使用@JmsListener
注釋bean方法,來注冊JMS偵聽器端點。XML命名空間設置也支持這種新的配置方式(jms:annotation-driven
),同樣,我們可以使用Java的配置文件,完全配置基礎設置(@EnableJms
,JmsListenerContainerFactory
)。也可以使用JmsListenerConfigurer
編程方式注冊偵聽器端點 。
Spring 4.1還與JMS支持對齊,讓您從Spring 4.0中的spring-messaging
4.0中引入其抽象介紹,即:
- 消息偵聽器端點可以具有更靈活的簽名,并受益于標準消息傳遞注釋,如
@Payload
,@Header
,@Headers
,@SendTo
。也可以使用標準Message
代替javax.jms.Message
方法參數。 - 新的
JmsMessageOperations
接口已經可用,并允許JmsTemplate像使用
Message`抽象的操作一樣。
最后,Spring 4.1提供了額外的其他改進:
-
JmsTemplate
支持同步請求/回復操作 - 可以為每個
<jms:listener/>
元素指定監聽優先級 - 使用
BackOff
實現可配置消息偵聽器容器的恢復選項 - 支持JMS 2.0消費共享
4.2緩存改進
Spring 4.1支持使用Spring現有緩存配置的JCache(JSR-107)注釋和基礎設施抽象;如果使用標準注釋,則不需要更改。
Spring 4.1同樣顯著提高了自身的緩存抽象:
- 緩存可以在運行時使用a級緩存解析器
CacheResolver
解析。因此,也不再強制使用值參定義緩存名。 - 可自定義更多的操作級:緩存解析器,緩存管理器,密鑰生成器
- 新的
@CacheConfig
類級注釋允許在類級別共享通用設置,而不啟用任何高速緩存操作。 - 使用CacheErrorHandler實現更好的緩存異常處理方法
Spring 4.1中還有一個突破性的修改,就是在緩存接口新增了一個putIfAbsent
方法
4.3 Web改進
- 在ResourceHttpRequestHandler的基礎上,拓展了資源處理的存在性支持,新增了拓展對象:
ResourceResolver
,ResourceTransformer
和ResourceUrlProvider
。許多內置的實現提供對版本化的資源URL的支持(用于有效的HTTP緩存),查找gzip壓縮的資源,生成HTML 5 AppCache清單等等。更多內容見第22.16.9節“資源的服務”。 - JDK 1.8的
java.util.Optional
現在支持@RequestParam
,@RequestHeader
以及@MatrixVariable
控制器的方法參數。 - 基礎服務中的
DeferredResult
已經返回的ListenableFuture
被新支持的ListenableFuture
返回值替代(或可能調用AsyncRestTemplate
)。 -
@ModelAttribute
方法現在按照相互依賴關系的順序進行調用。見SPR-6299。 - Jackson的
@JsonView
在@ResponseBody
和ResponseEntity
控制器方法中被直接支持,用于序列化同一POJO的不同數量的細節(例如摘要與詳細頁面)。通過將序列化視圖類型添加為特殊鍵下的模型屬性,也支持基于視圖的渲染。有關詳細信息,請參閱“Jackson序列化查看支持”一節。 - Jackson現在支持JSONP。請參閱“Jackson JSONP支持”一節。
- 在控制器方法返回之后和寫入響應之前,新的生命周期選項可用于攔截
@ResponseBody
和ResponseEntity
方法。利用聲明一個@ControllerAdvice
bean實現ResponseBodyAdvice
。內置的@JsonView
JSONP支持可以利用這一點。請參見第22.4.1節“使用HandlerInterceptor
攔截請求”。 - 有三個新的
HttpMessageConverter
選項:- Gson - 比Jackson更輕的腳本; 已經在Spring Android中使用過。
- Google協議緩沖器 - 作為企業內部的服務間通信數據協議而高效而有效,但也可以作為瀏覽器的JSON和XML公開。
- 通過
jackson-dataformat-xml
擴展,現在可以支持基于Jackson的XML序列化。當使用@EnableWebMvc
或<mvc:annotation-driven/>
的時候,如果jackson-dataformat-xml
是在類路徑下,當會默認使用此方法,而不是JAXB2。
- 像jsp這樣的視圖現在可以通過使用名稱來引用控制器映射來構建到控制器的鏈接。每個
@RequestMapping
都會分配一個默認名稱。例如FooController
,方法handleFoo
名為“FC#handleFoo”。命名策略是可修改的。還可以通過它的name屬性明確地命名一個@RequestMapping
。Spring JSP標記庫中的一個新增的mvcUrl函數使得在JSP頁面命名更加方便。請參見第22.7.2節“構建控制器的URI和視圖中的方法”。 -
ResponseEntity
提供了一個構建器式API來指導控制器方法來準備服務器端響應,例如ResponseEntity.ok()
。 -
RequestEntity
是一種新的類型,它提供了一個構建器樣式的API來指導客戶端REST代碼準備HTTP請求。 - MVC Java配置和XML命名空間:
-
Groovy標記模板支持(基于Groovy 2.3)。查看
GroovyMarkupConfigurer
和重新分析視圖解析器和“視圖”實現。
4.4 WebSocket消息傳遞改進
- 支持SockJS(Java)客戶端。參考
SockJsClient
和同包下的類。 - 當STOMP客戶端訂閱和取消訂閱時,新的應用上下文事件
SessionSubscribeEvent
和SessionUnsubscribeEvent
會被觸發。 - 新的作用域“
websocket
”。參考26.4.15 WebSocket作用域。 -
@SendToUser
只能把單會話作為目標,而且不需要用戶身份驗證。 -
@MessageMapping
方法可以使用點“.”代替斜杠“/”作為分割符。參考SPR-11660。 - STOMP/WebSocket監測信息收集和日志管理。參考26.4.17 運行時監測。
- 得到極大優化和改進的日志管理保留了可讀性和簡潔性,甚至是在DEBUG的時候。
- 優化了消息的創建,包含了對臨時消息可變性的支持,并避免自動消息id和時間戳的創建。參考Javadoc中的
MessageHeaderAccessor
。 - 在WebSocket會話創建60秒后沒有活動則將會關閉STOMP/WebSocket連接。參考SPR-11884。
4.5測試改進
- Groovy腳本現在可用于配置
ApplicationContext
,其中ApplicationContext
在測試上下文框架中被加載用于集成測試。- 有關詳細信息,請參閱“使用Groovy腳本的上下文配置”一節。
- 測試管理的事務現在可以通過新的
TestTransactionAPI
以編程方式啟動并在事務性測試方法中結束。- 有關詳細信息,請參閱“程序化事務管理”一節。
- 現在可以通過基于每個類或每個方法的新的
@Sql
和@SqlConfig
注釋聲明性地配置SQL腳本執行。- 有關詳細信息,請參見第15.5.8節“執行SQL腳本”。
- 可以通過新的
@TestPropertySource
注解配置用于測試的property源文件,它能夠自動地重寫系統和應用的property源文件。- 有關詳細信息,請參閱“具有測試屬性源的上下文配置”一節。
-
TestExecutionListener
現在可以自動發現默認值。- 有關詳細信息,請參閱“
TestExecutionListener
的自動發現”一節。
- 有關詳細信息,請參閱“
- 自定義
TestExecutionListener
現在可以自動與默認監聽器合并。- 有關詳細信息,請參閱“合并
TestExecutionListener
”一節。
- 有關詳細信息,請參閱“合并
- TestContext框架中的事務性測試支持文檔進行了更全面的解釋,并且對其他示例進行了改進。
- 對
MockServletContext
、MockHttpServletRequest
和其他Servlet API模擬的各種改進。 -
AssertThrows
已被重構為支持Throwable而不是Exception。 - 在Spring MVC測試中,可以用JSON斷言來斷言JSON響應,作為使用JSONPath的額外選項,就像使用XMLUnit可以為XML做的一樣。
- 現在可以在
MockMvcConfigurer
的幫助下創建MockMvcBuilder
清單。添加這個功能是為了能夠容易應用Spring安全設置,但可以用于封裝任何第三方框架或項目中的通用設置。 -
MockRestServiceServer
現在支持AsyncRestTemplate
客戶端測試。
5. Spring 4.2框架中的新特性和增強功能
5.1核心容器功能改進
- 諸如在Java 8默認方法中使用@Bean檢測和處理的注釋,允許使用默認@Bean方法從接口組態配置類。
- 配置類現在可以使用常規組件類聲明
@Import
,允許將導入的配置類和組件類混合起來。 - 配置類可以聲明一個
@Order
值,即使通過類路徑掃描檢測到的,也可以以相應的順序進行處理(例如,通過名稱重寫bean)。 -
@Resource
注入點支持@Lazy
聲明,類似于@Autowired
,接收到被請求的目標bean的延遲初始化代理。 - 應用程序事件基礎設施現在提供了一個基于注解的模型,以及發布任意事件的能力。
- 托管bean中的任何公共方法都可以注釋
@EventListener
來使用事件。 - @TransactionalEventListener 提供事務綁定事件支持。
- Spring Framework 4.2引入了一流的支持聲明和查找注釋屬性的別名。新
@AliasFor
注釋可用于在一個注釋中聲明一組別名屬性或在一個自定義屬性組成上的一個屬性中聲明一個別名去創建一個元數據的一個屬性。- 下面的注釋已經加裝
@AliasFor
,支持他們為其值屬性提供有意義的別名:@Cacheable
,@CacheEvict
,@CachePut
,@ComponentScan
,@ComponentScan.Filter
,@ImportResource
,@Scope
,@ManagedResource
,@Header
,@Payload
,@SendToUser
,@ActiveProfiles
,@ContextConfiguration
,@Sql
,@TestExecutionListeners
,@TestPropertySource
,@Transactional
,@ControllerAdvice
,@CookieValue
,@CrossOrigin
,@MatrixVariable
,@RequestHeader
,@RequestMapping
,@RequestParam
,@RequestPart
,@ResponseStatus
,@SessionAttributes
,@ActionMapping
,@RenderMapping
,@EventListener
,@TransactionalEventListener
。 - 例如,
spring-test
模塊的@ContextConfiguration
現在聲明如下:
- 下面的注釋已經加裝
public @interface ContextConfiguration {
@AliasFor("locations")
String[] value() default {};
@AliasFor("value")
String[] locations() default {};
// ...
}
- 同樣的, 重寫了元注解屬性的注解現在也可以使用@AliasFor細粒度地控制那些在注解層次結構中被重寫的屬性。事實上,現在可以給元數據的value屬性聲明一個別名。
- 例如,現在可以像下面一樣開發一種重寫了自定義屬性的組合注解。
@ContextConfiguration
public @interfaceMyTestConfig {
@AliasFor(annotation = ContextConfiguration.class, attribute = "value")
String[]xmlFiles();
// ...
}
- 參照[Spring注釋的編程模型](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#annotation-programming-model).
- 用于查找元注釋的Spring的搜索算法進行了許多改進。例如,在注解繼承體系中可以聲明局部的組合注解。
- 重寫了元注解屬性的組合注解現在可以用在接口、抽象類、橋接和接口方法上,也可以用在類、標準方法、構造方法和字段上。
- 代表注解屬性的
Map
(和AnnotationsAttributes
實例)可以被合成(或者轉換)到一個注解中。 - 基于字段的數據綁定(
DirectFieldAccessor
)可以與當前基于屬性的數據綁定(BeanWrapper
)一起使用。特別的,基于字段的綁定現在支持為集合、數據和Map導航。 -
DefaultConversionService
為Steam
、Charset
、Currency
和TimeZone
提供了可以直接使用的轉換器。這些轉換器也可以被添加到任意的ConversionService
中。 -
DefaultFormattingConversionService
為JSR-354中的貨幣提供了支持(如果javax.money
存在于classpath
下),即MonetaryAmount
和CurrencyUnit
。這也包含對@NumberFormat
的支持。 -
@NumberFormat
現在可以作為元注解使用。 -
JavaMailSenderImpl
有一個新的方法testConnection()
用于檢查與服務器間的連接。 -
ScheduledTaskRegistrar
暴露計劃的任務。 - Apache的
commons-pool2
現在支持AOP池CommonsPool2TargetSource
。 - 為腳本化bean引入了
StandardScriptFactory
作為一個基于JSR-223的機制,暴露于XML中的lang:std
元素。對JavaScript和JRuby的支持。(注意:JRubyScriptFactory
和lang:jruby
現在過時了,請使用JSR-223)
5.2 數據訪問的改進
- AspectJ現在支持
javax.transactional.Transactional
。 -
SimpleJdbcCallOperations
現在支持命名綁定。 - 全面支持Hibernate ORM 5.0,作為JPA提供者(自動適配),也支持其原生API(被新的
org.springframework.orm.hibernate5
包覆蓋)。 - 嵌入的數據庫現在可以被自動賦值不同的(unique)名字,且
<jdbc:embedded-database>
支持新的屬性database-name
。參考下面的“測試的改進”部分。
5.3 JMS的改進
-
autoStartup
屬性可以通過JmsListenerContainerFactory
控制。 - 每個監聽器容器都能配置應答
Destination
的類型。 -
@SendTo
注解的值現在可以使用SpEL表達式。 - 響應目標可以使用
JmsResponse
在運行時計算。 -
@JmsListener
是一個可重復性的注解,可以在同一個方法上聲明多個JMS容器(如果你還沒有使用Java 8,請使用新引入的@JmsListeners
)。
5.4 Web的改進
- 支持HTTP流和服務器發送事件。參考HTTP流。
- 支持內置CORS的全局(MVC Java配置和XML命名空間)和局部(例如,
@CrossOrign
)配置。參考27 CORS支持。 - HTTP緩存更新:
- 新的創建者
CacheControl
,嵌入到ResponseEntity
,WebContentGenerator
,ResourceHttpRequestHandler
中。 - 在
WebRequest
中改進了ETag/Last-Modified的支持。
- 新的創建者
- 自定義映射注解,使用
@RequestMapping
作為元注解。 -
AbstractHandlerMethodMapping
中的公共方法用于在運行時注冊和取消注冊請求映射。 -
AbstractDispatcherServletInitializer
中的保護方法createDispatcherServlet
進一步自定義DispatcherServlet
的實例。 -
HandlerMethod
作為@ExceptionHandler
方法的參數,特別在@ControllerAdvice
組件中非常便利。 -
java.util.concurrent.CompletableFuture
作為@Controller
方法的返回類型。 -
HttpHeaders
支持字節范圍的請求,并提供靜態資源。 -
@ResponseStatus
檢測嵌套異常。 -
RestTemplate
中的UriTemplateHandler
擴展點。-
DefaultUriTemplateHandler
暴露了baseUrl
屬性和路徑段編碼選項。 - 此擴展點可嵌入到URI模板庫中。
-
-
OkHTTP與
RestTemplate
集成。 - 自定義的
baseUrl
可以替代MvcUriComponentsBuilder
中的方法。 - 序列化/反序列化的異常信息在警告級別被記錄。
- 默認的JSON前綴從“"{} && " 改成了更安全的")]}', "中的一個。
- 新的擴展點
RequestBodyAdvice
和內置實現支持@RequestBody
方法參數上的Jackson的@JsonView
。 - 使用GSON或Jackson 2.6+時,處理器方法的返回類型被用于改進參數化類型的序列化,比如
List<Foo>
。 - 引入了
ScriptTemplateView
作為JSR-223用于處理腳本web視圖的機制,主要關注于Nashorn(JDK 8)上的JavaScript視圖模板。
5.5 WebSocket消息處理的改進
- 暴露關于已連接用戶和訂閱存在的信息。
- 新的
SimpUserRegistry
暴露為叫作“userRegistry”的bean。 - 在服務器集群間共享已存在的信息(參考代理中繼配置選項)。
- 新的
- 解決用戶在服務器集群中的目的地(參考代理中繼配置選項)。
-
StompSubProtocolErrorHandler
擴展點用來定制和控制STOMP錯誤幀到客戶端。 - 通過
@ControllerAdvice
組件聲明的全局方法@MessageExceptionHandler
。 - SpEL表達式“selector”頭用于
SimpleBrokerMessageHandler
的訂閱。 - 通過TCP和WebSocket使用STOMP客戶端。參考24.4.14 STOMP客戶端。
-
@SendTo
和@SendToUser
可以包含多個占位符。 - Jackson的
@JsonView
支持在@MessageMapping
和@SubscribeMapping
方法上返回值。 -
ListenableFuture
和CompletableFuture
可以作為@MessageMapping
和@SubscribeMapping
方法的返回值類型。 -
MarshallingMessageConverter
用于XML負載。
5.6 測試的改進
- 基于JUnit的集成測試現在可以使用JUnit規則執行而不是
SpringJUnit4ClassRunner
。這使得基于Spring的集成測試可以使用替代runner運行,比如JUnit的Parameterized
或第三方的runner如MockitoJUnitRunner
。 - Spring MVC測試框架現在對HtmlUnit提供了一流的支持,包括集成Selenium的WebDriver,允許基于頁面的web應用測試不再需要部署到一個Servlet容器上。
-
AopTestUtils
是一個新的測試工具類,它允許開發者可以獲取到底層的隱藏在一個或多個Spring代理類下的目標對象。 -
ReflectionTestUtils
現在支持為static修飾的靜態字段設值和取值,包括常量。 - 通過
@ActiveProfiles
聲明的bean定義配置文件的原始順序現在保留了,這是為了使用一些案例,比如Spring Boot的ConfigFileApplicationListener
,它通過有效的名稱來加載配置文件。 -
@DirtiesContext
現在支持新的模式BEFORE_METHOD
,BEFORE_CLASS
和BEFORE_EACH_TEST_METHOD
,用于在測試之前關閉ApplicationContext
。——例如,在大型測試套件中的一些劣質的測試毀壞了對ApplicationContext
的原始配置。 -
@Commit
這個新注解可以直接替代@Rollback(false)
。 -
@Rollback
現在可以用來配置類級別默認的回滾語義。- 因此,
@TransactionConfiguration
現在過時了,并且會在后續版本中移除。
- 因此,
- 通過
statements
這個新的屬性@Sql
現在支持內聯SQL語句的執行。 - 用于在測試期間緩存應用上下文的
ContextCache
現在是公共的API,它有默認的實現,可以替代自定義的緩存需求。 -
DefaultTestContext
,DefaultBootstrapContext
和DefaultCacheAwareContextLoaderDelegate
現在是support
子包下的公共類,允許自定義擴展。 -
TestContextBootstrappers
現在負責創建TestContext
。 - 在Spring MVC測試框架中,
MvcResult
的詳細日志現在可以在DEBUG級別被打印,或者寫出到自定義的OutputStream
或Writer
中。參考MockMvcResultHanlder
中的新方法log()
,print(OutputStream)
和print(Writer)
。 - JDBC XML的命名空間支持一個新的屬性
database-name
,位于<jdbc:embedded-database>
中,允許開發者為嵌入的數據庫設置不同的名字——例如,通過SpEl表達式或者被當前有效bean定義配置文件影響的屬性文件占位符。 - 嵌入的數據庫現在可以被自動賦予不同的名字,允許在同一測試套件不同的應用上下文中重復使用通用的測試數據庫配置。
-
MockHttpServletRequest
和MockHttpServletResponse
現在通過getDateHeader
和setDateHeader
方法提供了更好的支持用于格式化日期頭。
6. Spring 4.3的新特性和增強功能
6.1 核心容器的改進
- 核心容器提供了更豐富的元數據用于編程式評估。
- Java8的默認方法可以作為bean屬性的getter/setter方法被檢測。
- 在注入主bean的情況下,不會創建延遲候選bean。
- 如果目標bean僅僅定義了一個構造方法,就不必指定
@Autowired
注解了。 -
@Configuration
類支持構造方法注入。 - 任何用于指定
@EventLIstener
條件的SpEL表達式現在可以引用bean了(例如,@beanName.method()
)。 - 組合注釋現在可以使用數組的組件類型的單個元素覆蓋元注釋中的數組屬性。例如,
@RequestMapping
的String[] path
可以使用組合注解的String path
重寫。 -
@Scheduled
和@Schedules
可以作為元注解,用來創造組合注解并可重寫其屬性。 -
@Scheduled
支持任何作用域的bean。
6.2 數據訪問的改進
-
jdbc:initialize-database
和jdbc:embedded-database
支持應用于每個腳本的可配置分隔符。
6.3 緩存的改進
spring 4.3 允許并發調用給定的key,從而使得值只被計算一次。這是一項可選功能,通過@Cacheable
的新屬性sync啟用。這項功能也使Cache接口做了重大改變,增加了get(Object key, Callable<T> valueLoader)
方法。
spring 4.3 也改進了以下緩存方面的內容:
- 緩存相關的注解中的SpEL表達式現在可以引用bean了(比如,
@beanName.method()
)。 -
ConcurrentMapCacheManager
和ConcurrentMapCache
現在可以通過新的屬性storeByValue
序列化緩存的entry。 -
@Cacheable
,@CacheEvict
,@CachePut
和@Caching
現在可以作為元注解,用來創造組合注解并可重寫其屬性。
6.4 JMS的改進
-
@SendTo
現在可應用于類級別上,以便共享共同的目標。 -
@JmsListener
和@JmsListeners
現在可作為元注解,用來創造組合注解并可重寫其屬性。
6.5 Web的改進
- 內置了對Http頭和Http選項的支持。
- 新的組合注解
@GetMapping
,@PostMapping
,@PutMapping
,@DeleteMapping
和@PatchMapping
,它們來源于@RequestMapping
。 - 新的組合注解
@RequestScope
,@SessionScope
和@ApplicationScope
用于web作用域。 - 新的注解
@RestControllerAdvice
,它是@ControllerAdvice
和@ResponseBody
的組合體。 -
@ResponseStatus
現在可用于類級別并可以被所有方法繼承。 - 新的
@SessionAttribute
注解用于訪問session的屬性(查看示例)。 - 新的
@RequestAttribute
注解用于訪問request的屬性(查看示例)。 -
@ModelAttribute
可以設置其屬性binding=false
阻止數據綁定(查看參考)。 -
@PathVariable
可以被聲明為可選的(用于@ModelAttribute
方法)。 - 錯誤和自定義的異常可一致地暴露給MVC的異常處理器。
- Http消息轉換器中一致地處理字符集,默認地使用UTF-8處理多部分文本內容。
- 使用已配置的
ContentNegotiationManager
處理媒體類型等靜態資源。 -
RestTemplate
和AsyncRestTemplate
可通過DefaultUriTemplateHandler
支持嚴格的URI編碼。 -
AsyncRestTemplate
支持請求攔截。
6.6 WebSocket消息處理的改進
-
@SendTo
和@SendToUser
現在可應用于類級別上,以便共享共同的目標。
6.7 測試的改進
- spring測試上下文中的JUnit現在需要 4.12 及其更高版本。
-
SpringJUnit4ClassRunner
的新別名SpringRunner
。 - 測試相關的注解現在可用于接口上--例如,使用 基于Java 8的接口默認方法的測試接口。
- 如果默認的XML文件、Groovy腳本或
@Configuration
類被檢測到,那么空聲明的@ContextConfiguration
現在可以完全省略了. -
@Transactional
測試方法不再必需是public了(例如,在TestNG和JUnit 5 中)。 -
@BeforeTransaction
和@AfterTransaction
方法不再必需是public了,并且現在也可能用在Java 8 接口的默認方法上。 - spring測試上下文中的
ApplicationContext
緩存現在是有界的,默認最大值為32,并按最近最少原則回收。其最大值可以通過JVM的系統屬性或spring的屬性spring.test.context.cache.maxSize
進行設置。 - 用于自定義測試
ApplicationContext
的新ContextCustomizer
API在bean定義之后且上下文刷新之前被加載到上下文中。Customizer
可以通過第三方注冊,但需要實現自定義的ContextLoader
。 -
@Sql
和@SqlGroup
現在可作為元注解,用來創造組合注解并可重寫其屬性。 -
ReflectionTestUtils
在當set或get一個字段時,會自動解除代理。 - 服務器端的SpringMVC測試支持響應頭帶有多個值。
- 服務器端的SpringMVC測試解析表單數據請求內容并填充請求參數。
- 服務器端的SpringMVC測試支持對已調用的處理器方法模擬斷言。
- 客戶端的REST測試允許指明希望發送多少次請求并決定是否請求的順序可被忽略。
- 客戶端的REST測試支持在請求體中添加表單數據。
6.8 支持新庫和服務器
- Hibernate ORM 5.2(仍然能很好地支持4.2/4.3和5.0/5.1,但是3.6已經過時了)
- Jackson 2.8(至少需要2.6以上版本)
- OkHttp 3.x(同時仍然支持OkHttp 2.x)
- Tomcat 8.5.2 及 9.0 里程碑版
- Netty 4.1
- Undertow 1.4
- WildFly 10.1
另外,spring 4.3的spring-core.jar中集成了更新的ASM 5.1, CGLIB 3.2.4和Objenesis 2.4。