Spring 5 新特性總結
技術標籤:Spring
Spring 5 新特性總結
一、 升級到Java SE 8 和 Java EE 7
- 將Java8作為最低的JDK版本。
- Spring5在類路徑(和模組路徑)中完全相容Java9,而且它通過了JDK9測試套件的測試。
- 在API級別上,Spring5相容Java EE8技術,滿足對Servlet4.0、Bean Validation2.0和全新的JSON Binding API的需求。對Java EE API的最低要求為V7,該版本引入了針對Servlet、JPA和Bean Validation API的次要版本。
二、 反應式程式設計模型
- Spring5最令人興奮的新特性是它的反應式程式設計模型,它是完全非同步和非阻塞的。只需少量的執行緒,新的事件迴圈執行模型就可以垂直擴充套件。
- Spring5採用反應式流來提供在反應式元件中傳播負壓的機制。負壓是一個確保來自多個生產者的資料不會讓使用者不堪重負的概念。
- Spring WebFlux是Spring 5的反應式核心,它為開發人員提供了兩種為Spring Web程式設計而設計的程式設計模型:基於註解的模型和Functional Web Framework(WebFlux.fn)
- 基於註解的模型是Spring Web MVC的現代替代方案,該模型基於反應式基礎而構建,而Functional Web Framework是基於@Controller註解的程式設計模型的替代方案。這些模型都通過同一種反應式規則來執行,後者調整非阻塞HTTP來適應反應式流API。
三、 使用註解進行程式設計
Spring 5調整了Web MVC的@Controller程式設計模型,採用了相同的註解。請注意Mono和Flux等物件是實現反應式流規範中的Publisher介面的反應式型別,它們的職責是處理資料流。
@RestController // 反應式控制器
public class SimpleController {
@GetMapping("/list")
public Flux<PatentInformation> list(){
return null;
}
}
四、 函數語言程式設計
Spring 5的函式式方法將請求委託給處理函式,這些函式接收一個伺服器請求例項並返回一種反應式型別。
public class BookHandler {
public Mono<ServerResponse> list(ServerRequest request){
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(repository.allPeople(),Book.class);
}
public Mono<ServerResponse> getBook(ServerRequest request){
return repository.getBook(request.pathVariable("id"))
.then(book->ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(fromObject(book)))
.otherwiseIfEmpty(ServerResponse.notFound().build());
}
}
通過路由函式來匹配HTTP請求引數與媒體型別,將客戶端請求路由到處理函式。下面的程式碼展示了圖書資源端點URI將呼叫委託給合適的處理函式:
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
BookHandler handler = new BookHandler();
RouterFunction<ServerResponse> personRoute =
route(
GET("/books/{id}")
.and(accept(MediaType.APPLICATION_JSON)),handler::getBook)
.andRoute(GET("/books")
.and(accept(MediaType.APPLICATION_JSON)),handler::list);
這些示例背後的資料儲存也支援完整的反應式體驗,該體驗是通過Spring Data對反應式Couchbase、Reactive MongoDB和Cassandra的支援來實現的。
五、 使用REST端點執行反應式程式設計
WebFlux模組為RestTemplate提供了一種完全非阻塞、反應式的替代方案,名為WebClient:
Mono<Book> book = WebClient.create("http://localhost:8080")
.get()
.uri("/books/{id}",123)
.accept(MediaType.APPLICATION_JSON)
.exchange(request)
.then(response->response.bodyToMono(Book.class));
六、 支援HTTP/2
HTTP/2提高了傳輸效能,減少了延遲,並提高了應用程式的吞吐量。儘管HTTP/2的伺服器推送功能已通過Jetty Servlet引擎的ServerPushFilter類向Spring開發人員公開。
Spring 5.1提供Servlet4.0,Http/2新特性將由Tomcat9.0、Jetty9.3和Undertow1.4原生提供。
七、 Kotlin 和 Spring WebFlux
八、 使用Lambda表示式註冊Bean
作為傳統XML和JavaConfig的替代方案,現在可以使用Lambda表示式註冊Spring Bean。
GenericApplicationContext context = new GenericApplicationContext();
context.registerBean(Book.class,()->new Book(context.getBean(Author.class)));
九、 使用Junit5執行條件和併發測試
1.1. Junit5的支援
@Test
void sumTest(){
assertTrue(Stream.of(20,40,50).mapToInt(i->i).sum()>110,()->"Total then 100");
}
1.2. 遷移到Junit5
Junit5條件測試執行註解@EnabledIf 和@DisabledIf來自動計算一個SpEL(Spring Expression Language)表示式,並適當啟用或禁用測試。
1.3. 使用Spring WebFlux執行整合測試
WebTestClient可繫結到真實的伺服器,或者使用控制器或函式。
在下面的程式碼中,WebTestClient被繫結到localhost:
WebTestClient testClient = WebTestClient.bindToServer()
.baseUrl("http://localhost:8080")
.build();
下面的程式碼將WebTestClient繫結到RouterFunction:
RouterFunction bookRouter = RouterFunctions.route(
RequestPredicates.GET("/books"),
serverRequest -> ServerResponse.ok().build()
);
WebTestClient.bindToRouterFunction(bookRouter)
.build()
.get()
.uri("/books")
.exchange()
.expectStatus()
.isOk()
.expectBody()
.isEmpty();