spring4.X 的更新大全

PartII :spring 4.0的更新

4. spring 4.1的提高和改善

4.1 JMS 提高

spring4.1引進了一個更簡單的組件去註冊JMS監聽端點,及使用@JmsListener註解;這個XML命名空間已經提高爲支持註解驅動風格,你能夠徹底使用用java config來進行配置(在@Config類裏用@EnableJms,JmsListenerContainerFactory).你也可使用JmsListenerConfigurer類來用程序註冊監聽端點; spring4.1還調整了4.0中引進的spring4.0的spring-messaging 抽象,讓你繼續享受其便利;html

  • 消息監聽器端點能夠有一個更靈活的簽名,並從消息註解中獲益,如@payload,@Headers,@Headers,@SendTO.它還可使用標準的Message來替代javax.jms.Message做爲方法參數
  • 提供了一個新的JmsMessageOperations接口,並容許JmsTemplate使用Message抽象進行操做 最後,spring4.1提供了額外的五花八門的改進
  • 在JmsTemplate中進行同步的請求回覆操做支持
  • 監聽器的優先級能夠指定每一個jms:listenter/元素
  • JMS2.0 能夠共享消費者
  • 消息監聽器容器的恢復選項經過是用BackOff的實現來配置;

4.2 緩存改善

spring 4.1 經過使用已存在的緩存配置和框架抽象支持Jcache(JSR-107)註解;所以在使用時無需其餘改變; spring 4.1也顯著改善了本身的緩存抽象;前端

  • 能夠經過CacheResolver釋放緩存;所以定義緩存名稱來使用再也不是強制的;
  • 更多操做級別的自定義:緩存解析器,緩存管理器,鍵值生成器
  • 一個新的@CacheConfig 類級別的註解;提供類別的共享而無需緩存操做;
  • 在使用CacheErrorHandler時會有更好的緩存方法異常處理; 因爲添加了新的方法putIfAvsent,spring4.1在緩存上有了衝破性提高;

4.3 Web Improvements (web 提高)

  • 對原來處理資源的ResourceRequestHandler擴展爲新的抽象ResourceResolver,resourceTransformer,ResourceUrlProvider.經過一些內置的實現提供了對版本化資源URLS(對於高效的http緩存),gzipped壓縮定位資源,生成必定H5的應用緩存表現,還有更多.具體參見 Section 22.16.9, 「Serving of Resources」;java

  • jdk 1.8的java Optional類的使用;@RequestParam,@RequestHeader,@MatriVariable等註解做爲控制器方法參數的類型web

  • ListenableFuture 已被列爲DeferredResult返回值的一個可選項,當其 一個下屬的服務(又或者 對AsyncRestTemplate的調用)已返回ListenableFuture 值;算法

  • @ModelAttribute 的方法在調用時會考慮內置依賴問題的順序問題spring

  • 加了@ResponseBody和ResponseEntity控制器支持Jackson的@JsonView,它能夠序列化同一個POJO類的不一樣細節.經過在特定的關鍵字下,添加序列化視圖類型做爲一個model的參數,它會支持改視圖渲染.具體細節參見 the section called "Jackson Serialization View Support" ;sql

  • JSONP如今支持Jackson;查看 the section called 「Jackson JSONP Support」.數據庫

  • 一個新的生命週期選型:在@ResponseBody和ResponseEntity方法返回結果以後,response寫出以前.利用@ConrollerAdvice bean來實現ReponseBodyAdvice接口.利用它們來實現@JsonView和JSONP;具體參見22.4.1 經過處理攔截器攔截請求;編程

  • 這裏有三個新的HttpMessageConverter選項json

  • Gson 比Jackson佔用的空間更輕;已在Spring Android項目中使用

  • Google Protocol Buffers (Google 協議緩存)簡潔高效的企業級內置服務通訊數據協議;卻能夠爲瀏覽器導出JSON和xml數據;

  • 經過jackson-dataformat-xml擴展,能夠支持基於Jackson的xml序列化;當你使用@EnableWebmvc或添加mvc:annotation-driver/時,若是你的根目錄有jackson-dataformat-xml時,它就會默認取代JAXB2(java Architecutrue for xml Binding,java和xml相互轉化).

  • 視圖和控制器之間的連接能夠經過名字映射.每一個@RequestMapping 都會制定一個默認的名字;例如:FooController裏的handleFoo方法的命名爲'FC#handleFoo'.這個命名策略是可插拔的.它也能夠用@RequestMapping的名稱屬性進行詳細命名.一個新在Spring JSP標籤庫的mvcUrl的函數使得它在JSP頁面能夠輕易使用;詳情可見從視圖中建立鏈接指向前端控制器和方法;

  • ResponseEntity提供了一個構造器風格的API來指導控制器方法進行服務器端的Rest迴應.例如ResponseEntity.ok();

  • RequestEntity 是一個新類型,它提供了一個構造器風格的API,能夠指導客戶端 REST代碼發起 http請求.

  • MVC的java配置和xml命名空間 1.視圖渲染其包括視圖協商均可以配置; 見視圖渲染部分 2.視圖控制器內置了對重定向和返回狀態設置的支持.一個應用能夠用它來配置重定向的URLS,提供了帶視圖的404迴應,發送了一個"no content"迴應; 3.路徑自定義匹配常用,然如今已內置;

  • Groovy markup template 支持(基於Groovy 2.3).查看GroovyMarkupConfigurer,表現層視圖渲染,'View'實現;

4.4 WebSocket Messageing improvement

  • SockJs 客戶端支持;在該包下查看SockJsClient及其相關的類
  • 發佈了新的應用上下文事件-SessionSubscribeEvent和SessionUnsubscribeEvent事件;當STOMP客戶端訂閱或退訂時;
  • 新的"websocket"做用域;查看 Section 26.4.14, 「WebSocket Scope」
  • @SendToUser 只針對一個session,且沒必要須是經過認證的用戶
  • @MessageMapping 方法可用使用符號-'.'來替代斜線--'/'做爲路徑分隔符;查看 SPR-11660
  • STOMP/WebSocket 監控信息收集和記錄;查看Section 26.4.16,"Runtion Monitoring"
  • 日誌獲得了顯著的提高和優化,使其在Debug級別都保持可讀性和簡潔性;
  • 改善消息新建;支持臨時變變消息,避免自動消息id和timestamp creation.查看MessageHeaderAccessr的註釋文檔
  • 當WebScoket會話創建以後,若是60秒內沒有活動,就能夠關閉該連接;

4.5 測試模塊的優化

  • Groovy 腳本能夠在TestContext框架裏配置爲集成測試加載的ApplicationContext;具體細節參照the section called 「Context configuration with Groovy scripts」
  • 新的TestTransaction API,經過它你能夠以編程方式開始和關閉你事務 測試方法中的測試管理事務 ; 查看編程事務管理部分;
  • sql腳本執行能夠經過新的@Sql和@SqlConfig註解進行聲明式配置,它做用於每一個類和方法之上; 執行sql腳本
  • 測試屬性資源能夠經過新的@TestPropertySource註解進行配置系統和應用的屬性資源;
  • 默認的TestExecutionListener 能夠被自動發現
  • TestContext框架對事務測試支持的文檔經過詳細的解釋和額外的例子獲得了提高;
  • 對於MockServletContext,MockHttpServletRequest,其餘Servlet APi模擬的的提高
  • AssertThrows如今能夠支持Throwable,而不僅是Exception;
  • 在spring MVC測試中,可使用JSON Assert基於JSONPath進行判斷不是基於XML;
  • MockMVcBuilder 類,如今能夠在MockMvcConfigurer幫助下新建;它能夠將在項目裏的第三方的框架調用Spring security 框架封裝爲公共的方法
  • MockRestServiceServer 如今支持對客戶端測試的AsyncRestTemplate服務

4.2的新特性

5.1核心容器(Core Container)

  • 在jdk8下方法的一些註解如@Bean能夠進行檢測和處理,這樣你能夠用帶@Bean的方法組成一個實現配置接口的配置類

  • 配置類可使用@Import註解,支持混合引入配置classes和組件class;

  • 配置文件可使用@Order配置值,當路徑掃描時它們會按順序進行處理;

  • @Resource 注入如今也支持懶加載(@Lazy)註解,和@Autowired同樣,它將收到一個請求目標bean的懶啓動代理;

  • 應用事件設施如今提供了基於註解的模式,能夠發佈任意事件; 1.任意在管理的Bean裏的public方法只要標誌爲@EventListener,便可消費事件; 2.@TransactionalEventListener註解提供了事務邊界內事件支持

  • 註解屬性別名支持:@AliasFor:做用於自定義註解裏,支持爲值屬性指定一些有意義的別名; 1.支持的註解有:@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

    2.例如,在spring-test部分裏的@ContextConfiguration能夠以下定義:

public @interface ContextConfiguration{
	  @AliasFor("locations")
	  String[] value() default{};
	  @AliasFor("value")
	  String[]locations() default{};
  }

3.一樣的,它也能夠用在自定義組合註解裏,用於在一個註解層次裏確切的指定一個屬性值;實際上,如今能夠爲value值申明一個註解;

4.例如,一個可使用@AliasFor進行自定義註解

@ContextConfiguration
 public @interface MyTestConfig{
    @AliasFor(annotation=ContextConfiguration.class,attribute="value")
	String[]xmlFiles();
 }

5.詳情請看Spring註解編程

  • 對註解的發現算法有了顯著提高.例如,本地的自定義註解更傾向於註解繼承.

  • 從元註解修改屬性的組合註解,如今能夠在接口,抽象類,橋接方法,接口方法,還包括在類,標準方法,構造器,字段裏被發現和掃描;

  • 表明註解屬性(還有註解屬性實例的)的集合能夠被合成一個註解.

  • 基於字段的數據綁定(DirectFieldAccessor)的功能獲得了和基於屬性數據綁定的BeanWrapper同樣的支持.特別是,字段綁定如今支持對集合,數組和Map的導航

  • DefaultConversionService如今爲Strem(流),Charset(字符集),Currency(貨幣),TimeZone(時區)提供了開箱即用的轉化器.這些轉化器能夠單獨的添加到任意ConversionService中;

  • DefaultFormattingConversionService提供了對JSR-354 Money&Currency的值類型提供了開箱即用的支持(javax.money得在你的classpath中):貨幣單位和貨幣總值.它一樣支持使用@NumberFormat 註解

  • @NumberFormat 能夠被用爲元註解

  • javaMailSenderImpl有一個新的testConnection()方法來檢查服務器的鏈接性;

  • ScheduledTaskRegistrar 能夠對外暴露Schedule 任務;

  • Apache commons-pool2如今支持一個共用AOP的CommonsPool2TargetSource資源;

  • 引入了StandarScriptFactory做爲一個JSR-223爲基礎的腳本Bean機制,經過xml文件元素lang:std來暴露.支持包括 JavaScript和JRuby;(備註:因爲JSR-223的使用,JRubyScriptFactory 和 lang:jruby標籤如今已通過時了)

5.2 數據訪問提高

  • javax.transaction.Transactional如今支持AspectJ
  • SimpleJdbcCallOperations如今支持命名綁定
  • 支持hibernate ORM5.0,經過他的原生API,它會做爲一個JPA提供者;(新的org.springframework.orm.hibernate5轉換)
  • 可用的數據庫會自動分配一個惟一的名字;jdbc:embedded-database標籤提供了一個新的database-name屬性;更多細節查看'Testing Improvements'

5.3 JMS優化

  • 'autoStartup'屬性能夠經過JmsListenerContainerFactory來控制
  • 答覆的類型即Destination能夠經過一個listener container來配置
  • @SendTo註解的值能夠是SpEL表達式
  • 回覆的目的能夠在運行時經過JmsResponse來計算
  • @JmsListener 如今已經做爲一個可複用的註解,即在統一方法上申明幾個JMS容器.若是你不是jdk1.8,那仍是用之前的@JmsListeners吧;

5.4 web 改善

  • http流和服務器發送事件支持(Sever-Sent Events support),查看 http流模塊;

  • 對CORS內置支持,包括全局(MVC java配置和xml命名空間)和本地(@CrossOrigin)配置;細節查看27章 CORS支持

  • http 緩存更新

    1.新的CacheController組件,已插入到ResponseEntity,WebContentGenerator,ResourceHttpRequestHandler中.

    2.在WebRequest中改善了 ETag/Last-Modified支持

  • 自定義請求映射註解,能夠把@RequestMapping做爲元註解

  • 在AbstractHandlerMethodMapping中的公共方法能夠在運行時用來註冊和註銷請求映射;

  • AbstractDispatcherServletInitializer類中的protected createDispatcherServlet方法能夠用來自定義要使用的DispatcherServlet實例;

  • @ExceptionHandle類中方法的方法參數之一是HandlerMethod類;特別是用於@ControllerAdvice組件

  • java.util.concurrent.CompletableFuture能夠做爲控制器方法的返回類型

  • HttpHeader支持Byte-range(字節流) 請求用來提供靜態資源;

  • @ResponseStatus 能夠在內嵌的異常中檢測

  • RestTemplate的UriTemplateHandler擴展點 1.DefaultUriTemplateHandler暴露了baseUrl屬性,路徑部分編碼選項; 2.這個擴展點在任何URI template類庫裏都是可插拔的

  • OkHTTP 集成了 RestTemplate

  • 在MvcUriComponentsBuilder組件中自定義方法的 baseUrl選項;

  • Serialization/deserialization(序列化和反序列異常)如今都被記錄爲Warn級別;

  • 默認的JSON前綴已經從"{}&&"轉爲更安全的")]}',";

  • 新的 RequestBodyAdvice 擴展點及其擴展點支持在@ResponseBody 方法參數上使用 Jackson的@JsonView註解

  • 當使用GOSN或Jackson 2.6+時,處理方法返回類型已支持序列化的參數類型如List<Foo>;

  • 爲腳本web視圖引入以JSR-223爲基礎機制的ScriptTemplateView,這是Nashon(JDK8)上js視圖模板的一個焦點

WebSocket Messageing 改善

  • 暴露關於用戶和訂閱的存在信息 1.新的SimpUserRegistry暴露了一個bean叫"UserRegistry"; 2.經過服務集羣(查看代理終端配置選項)共享顯示信息;
  • 經過服務集羣釋放用戶目的地 (查看代理終端配置選項)
  • StompSubProtocolErrorHandler擴展點能夠定製並控制客戶端的STOMP ERROR架構
  • 在@ControllerAdvicce組件裏定義全局的@MessageExceptionHandler方法
  • 用SimpleBrokerMessageHandler來處理訂閱的心跳和SpEL表達式 'selector'請求頭
  • STOMP客戶端經過TCP和WebSocket協議來使用;詳情見 STOMP 客戶端
  • @SendTo和@SendTOUser能夠包含目的地值提示
  • Jackson 的@JsonView 註解可使用在@MessageMapping和@SubscriptMapping方法的返回值上.
  • ListenableFuture和CompletableFuture能夠是@MessageMapping和@SubscriptMapping方法的返回值類型
  • MarshallingMessageConverter對於xml的有效載荷

5.6 Testing改進

  • 單元集成測試如今能夠經過使用Junit規則來替代SpringJunit4ClassRunner.他容許基於spring的集成測試.這容許spring集成測試經過其餘的選擇來啓動項Junit的參數化或者第三方啓動器,例如MockitoJunitRunner.
  • spring mvc test框架如今聽了對HTMLUnit提供了一流的支持,包括對Selenium webDriver的集成,容許你對基於頁面的web應用進行測試而不須要一個servlet容器;
  • AopTestUtils 是一個新的測試功能,它容許開發者使用一個引用--目標類下隱藏着一個或多個spring代理.
  • ReflectionTestUtils如今支持靜態字段的設置和獲取,包括常量
  • 經過@ActiveProfiles定義的Bean定義簡介的排列順序如今已重構,目的是支持一些使用場景,如使用spring Boot的ConfigFileApplicationListener,它強經過active profile的名字來加載配置文件
  • @DirtiesContext支持新的BEFORE_METHOD,BEFORE_CLASS,還有BEFORE_EACH_TEST_METHOD模式來在測試以前關閉ApplicationCotext.例如,一些有很大測試套件的流氓(已經肯定的)測試會損壞ApplicationContext的原始配置;
  • @Commit 註解能夠做爲@Rollback(false)註解的替代品;
  • @Rollback如今也能夠用於配置class級別的默認回滾語義.所以,2TransactionConfiguration如今已通過時了,下個版本就會去掉
  • @Sql如今經過新的屬性--statements支持行內sql狀態
  • 用於存儲不一樣測試單元之間上下文的ContextCache已有一個默認實現的API,能夠替代自釘子緩存需求
  • DefaultTestContext,DefaultBootstrapContext,DedaultCacaheAwareContextLoadeerDelegate如今是support包下的公共的class,容許被自定義擴展;
  • TestContextBootstrapper如今負責構建TestContext上下文
  • 在spring mvc Test 框架下,mvcResult細節能夠被記錄爲DEBUG級別,或者寫到一個自定義的輸出流或Writer裏.細節請到MockMvcResultHandlers查看新的log(),print(OutputStream),以及print(Writer)方法
  • JDBC xml命名空間如今在jdbc:embedded-database支持新的database-name屬性,容許開發者爲每一個可用的databases設置一個獨一無二的名字.例如,經過一個SpEL 表達式或者屬性提醒器(它能夠被當前bean啓動簡介影響)
  • MockHttpServletRequest 和MockHttpServletResponse 如今能夠經過getDateHeader和setDateHeader方法支持對日期頭更好的格式化

spring4.3的新功能和新特性

6.1 核心容器的提高(Core Container Improvements)

  • 核心容器異常提供更肺腑的元數據支持已達到程序化評估
  • java8默認的方法支持檢測bean屬性的get和set方法
  • 當bean只有一個構造器時,此時沒有必要指定@Autowired註解
  • @Configuration 類支持構造器注入;
  • SpEL表達式曾用於指定@EventListener的條件,如今能夠用來指定beans(例如@beanName.method())
  • 組合註解如今能夠用數組組件類型的單個元素來 重寫元註解中的數組屬性;好比,@RequestMapping中的屬性 String[] path 能夠在一個組合註解中重寫爲String path屬性
  • @Scheduled 和 @Schedules 能夠被用做元註解,於是也能夠被自定義註解重寫屬性
  • @Scheduled 能夠更好的支持各類做用域的beans;

6.2 數據訪問提高

  • jdbc:initialize-database和jdbc:embedded-database支持一個可配置的分割器來使用各自的腳本.

6.3緩存優化

  • spring 4.3如今容許一個特定key的同時調用進行同步,因此這些值只能計算一次;這是一個選擇的功能能夠經過@Cacheable註解新的sync屬性來實現.因爲添加了一個get(Object key,Callable<T> valueLoader)方法,該功能爲Cache接口帶來一個突破性的變革.
  • 在caches相關的註解如今可使用SpEL 表達式來指定beans(例如 @BeanName.method())
  • ConcurrentMapCacheManager和ConcurrentMapCache如今經過新的 屬性--storeByValue支持緩存鍵值對的序列化
  • @Cacheable,@cacheEvict,@cachePut,@Caching能夠被當作元註解使用

6.4 JMS 優化

  • @SendTo 如今能夠被指定爲類級別的,能夠共享一個通用的回覆地址
  • @JmsListener和@JmsListeners能夠做爲元註解

6.5 web提高

  • 對HTTP head和http OPtions內置支持
  • 新的@GetMapping,@PostMapping,@PUtMapping,@DeleteMapping,@PatchMapping,它們使@RequestMapping的組合註解;詳情查看組合註解
  • 新的做用域web scope的 @RequestScope,@SessionScope,@ApplicationScope組合註解;三個註解詳情
  • 新的 @RestControllerAdvice 註解混合了@ControllerAdvice和@ResponseBody的語法
  • @ResponseStatus 如今支持類級別,並能夠被全部方法繼承
  • 新的@SessionAttribute註解能夠訪問session的屬性
  • 新的@RequestAttribute註解能夠訪問rquest的屬性
  • @ModelAttribute 能夠阻止數據綁定,經過binding=false屬性
  • 在mvc異常處理器中,將Errors和自定義Throwables 統一暴露;
  • 在Http消息轉化器(http message converters)中進行字符集處理,包括將urf-8做爲混合文本內容的默認字符集
  • 靜態資源處理器使用配置的ContentNegotiationManger對媒體資源類型進行判斷
  • RestTemplate 和 AsynRestTemplate經過defaultUriTemplateHandler進行嚴格的URI便利編碼
  • AsyncRestTemplate支持嚴格的請求攔截

6.6 WebSocket Messaging 優化

  • @SendTo 和SendToUser 能夠做用於類級別

6.7 測試優化

  • Spring TestContext Framework 對Junit要求4.12或更高版本
  • SpringRunner是SpringJunit4ClassRunner的別名
  • Test相關注解能夠被宣佈在註解上,例如,對測試接口的使用能夠利用java8中的接口默認方法 -若是當默認的XML文件,Groovy腳本,@Configuration class被發現時 @ContextCongfiguration空的申明如今能夠忽略了,
  • @Transactional 測試方法再也不要求必須是public的了.好比TestNG或JUnit5
  • @BeforeTransaction 和@AfterTranscation 方法再也不要求必須是public的,也能夠在java8接口的默認方法中使用
  • 在 spring TestCOntext Framework 緩存中的ApplicationContext,如今已被默認的最大值32和最近不多使用的放逐政策所限定.緩存的最大規模能夠被一個JVM系統參數或者spring的屬性spring.test.context.cache.maxSize來配置.
  • 新的ContextCustomizer API能夠自定義一個測試的ApplicationContext,它在bean定義加載以後,在上下文刷新以前.自定義器能夠被第三方jar包註冊,摒棄了對其自定義ContextLoader的需求;
  • @Sql和@SqlGroup能夠做爲元註解
  • ReflectionTestUtils如今自動獲取代理當你設置或者獲取一個字段時
  • 服務端的spring mvc test支持在response header上混合值的預期
  • 服務端的spring mvc test能夠轉化form表單並操做請求參數
  • 服務端的spring mvc test在啓動處理方法時支持模擬斷言
  • 客戶端的Rest 測試能夠指明一個請求的測試次數及其哪些聲明的預期將被忽略.
  • 客戶端的Rest Test 對請求體中form data的預期

6.8 對新的libary和服務器版本的支持

  • hibernate ORM5.2 (4.2,4.3,5,0,5.2,其餘都過期了)
  • Jackson 2.8 (2.6+)
  • OkHttp 3.x(同時支持2.X)
  • Netty 4.1
  • Undertow 1.4
  • Tomcat 8.5.2 ,9.0M6
  • 在spring-core.jar中更新 ASM5.1和Objenesis 2.4
相關文章
相關標籤/搜索