spring4新特性之web開發(fā)增強(qiáng)
從Spring4開始,Spring以Servlet3為進(jìn)行開發(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 {
}
這樣當(dāng)你開發(fā)Rest服務(wù)器端的時候,spring-mvc配置文件需要的代碼極少,可能就僅需如下一行:
Java代碼
<context:component-scan base-package="com.bjpowernode.spring4"/> <mvc:annotation-driven/>
2、mvc:annotation-driven配置變化
統(tǒng)一風(fē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默認(rèn)使用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ā)增強(qiáng),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Spring事物的傳播特性詳解
- Spring Boot 2.4新特性減少95%內(nèi)存占用問題
- Spring Boot 2.4 新特性之一鍵構(gòu)建Docker鏡像的過程詳解
- spring5新特性全面介紹
- SpringBoot新特性之全局懶加載機(jī)制
- 全面解析Spring Security 過濾器鏈的機(jī)制和特性
- SpringBoot2.3新特性優(yōu)雅停機(jī)詳解
- 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框架詳細(xì)介紹
- 詳解Spring工廠特性
相關(guān)文章
Java如何接收前端easyui?datagrid傳遞的數(shù)組參數(shù)
這篇文章分享一下怎么在easyui的datagrid刷新表格時,在后端java代碼中接收datagrid傳遞的數(shù)組參數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11
使用XSD校驗Mybatis的SqlMapper配置文件的方法(1)
這篇文章以前面對SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),簡單的介紹了相關(guān)操作知識,然后在給大家分享使用XSD校驗Mybatis的SqlMapper配置文件的方法,感興趣的朋友參考下吧2016-11-11
dockerfile-maven-plugin極簡教程(推薦)
這篇文章主要介紹了dockerfile-maven-plugin極簡教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
一文詳解如何配置MyBatis實現(xiàn)打印可執(zhí)行的SQL語句
在MyBatis中,動態(tài)SQL是一個強(qiáng)大的特性,允許我們在XML映射文件或注解中編寫條件語句,根據(jù)運行時的參數(shù)來決定SQL的具體執(zhí)行內(nèi)容,這篇文章主要給大家介紹了關(guān)于如何配置MyBatis實現(xiàn)打印可執(zhí)行的SQL語句的相關(guān)資料,需要的朋友可以參考下2024-08-08
java聯(lián)調(diào)生成測試數(shù)據(jù)工具類方式
這篇文章主要介紹了java聯(lián)調(diào)生成測試數(shù)據(jù)工具類方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

