spring4新特性之web開發(fā)增強
從Spring4開始,Spring以Servlet3為進行開發(fā),如果用Spring MVC 測試框架的話需要指定Servlet3兼容的jar包(因為其Mock的對象都是基于Servlet3的)。另外為了方便Rest開發(fā),通過新的@RestController指定在控制器上,這樣就不需要在每個@RequestMapping方法上加 @ResponseBody了。而且添加了一個AsyncRestTemplate ,支持REST客戶端的異步無阻塞支持。
1、@RestController
Java代碼
@RestController
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/test")
public User view() {
User user = new User();
user.setId(1L);
user.setName("haha");
return user;
}
@RequestMapping("/test2")
public String view2() {
return "{\"id\" : 1}";
}
}
其實現(xiàn)就是在@@RestController中加入@ResponseBody:
Java代碼
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBod
public @interface RestController {
}
這樣當你開發(fā)Rest服務(wù)器端的時候,spring-mvc配置文件需要的代碼極少,可能就僅需如下一行:
Java代碼
<context:component-scan base-package="com.bjpowernode.spring4"/> <mvc:annotation-driven/>
2、mvc:annotation-driven配置變化
統(tǒng)一風格;將 enableMatrixVariables改為enable-matrix-variables屬性;將ignoreDefaultModelOnRedirect改為ignore-default-model-on-redirect。
3、提供AsyncRestTemplate用于客戶端非阻塞異步支持。
3.1、服務(wù)器端
Java代碼
@RestController
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/api")
public Callable<User> api() {
System.out.println("=====hello");
return new Callable<User>() {
@Override
public User call() throws Exception {
Thread.sleep(10L * 1000); //暫停兩秒
User user = new User();
user.setId(1L);
user.setName("haha");
return user;
}
};
}
}
非常簡單,服務(wù)器端暫停10秒再返回結(jié)果(但是服務(wù)器也是非阻塞的)。具體參考我github上的代碼。
3.2、客戶端
Java代碼
public static void main(String[] args) {
AsyncRestTemplate template = new AsyncRestTemplate();
//調(diào)用完后立即返回(沒有阻塞)
ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);
//設(shè)置異步回調(diào)
future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {
@Override
public void onSuccess(ResponseEntity<User> result) {
System.out.println("======client get result : " + result.getBody());
}
@Override
public void onFailure(Throwable t) {
System.out.println("======client failure : " + t);
}
});
System.out.println("==no wait");
}
此處使用Future來完成非阻塞,這樣的話我們也需要給它一個回調(diào)接口來拿結(jié)果; Future和Callable是一對,一個消費結(jié)果,一個產(chǎn)生結(jié)果。調(diào)用完模板后會立即返回,不會阻塞;有結(jié)果時會調(diào)用其回調(diào)。
AsyncRestTemplate默認使用SimpleClientHttpRequestFactory,即通過java.net.HttpURLConnection實現(xiàn);另外我們也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());設(shè)置即可。
另外在開發(fā)時盡量不要自己注冊如:
Java代碼
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
盡量使用
Java代碼
<mvc:annotation-driven/>
它設(shè)計的已經(jīng)足夠好,使用子元素可以配置我們需要的配置。
且不要使用老版本的:
Java代碼
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
否則可能得到如下異常:
寫道
Circular view path [login]: would dispatch back to the current handler URL [/spring4/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
總結(jié)
以上所述是小編給大家介紹的spring4新特性之web開發(fā)增強,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Spring事物的傳播特性詳解
- Spring Boot 2.4新特性減少95%內(nèi)存占用問題
- Spring Boot 2.4 新特性之一鍵構(gòu)建Docker鏡像的過程詳解
- spring5新特性全面介紹
- SpringBoot新特性之全局懶加載機制
- 全面解析Spring Security 過濾器鏈的機制和特性
- SpringBoot2.3新特性優(yōu)雅停機詳解
- Spring MVC接受表單自動封裝特性實例解析
- SpringBoot2.0新特性之配置綁定全解析
- Spring各版本新特性的介紹
- Intellij IDEA 2017新特性之Spring Boot相關(guān)特征介紹
- 簡單了解Spring Framework5.0新特性
- 淺析Spring4新特性概述
- Spring 4 支持的 Java 8 特性
- java Spring 5 新特性函數(shù)式Web框架詳細介紹
- 詳解Spring工廠特性
相關(guān)文章
GateWay路由規(guī)則與動態(tài)路由詳細介紹
這篇文章主要介紹了GateWay路由規(guī)則與GateWay動態(tài)路由,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
Spring Bean創(chuàng)建和循環(huán)依賴
這篇文章主要介紹了Spring Bean創(chuàng)建和循環(huán)依賴,講述了Spring容器中?Bean?的創(chuàng)建過程已經(jīng)主要的方法,另外也著重分析了循環(huán)依賴的問題,需要的小伙伴可以參考一下2022-05-05
Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息的完整代碼
kakfa是我們在項目開發(fā)中經(jīng)常使用的消息中間件。由于它的寫性能非常高,因此,經(jīng)常會碰到讀取Kafka消息隊列時擁堵的情況,這篇文章主要介紹了Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息,需要的朋友可以參考下2023-02-02

