spring4新特性之web開發(fā)增強(qiáng)
從Spring4開始,Spring以Servlet3為進(jìn)行開發(fā),如果用Spring MVC 測試框架的話需要指定Servlet3兼容的jar包(因?yàn)槠銶ock的對(duì)象都是基于Servlet3的)。另外為了方便Rest開發(fā),通過新的@RestController指定在控制器上,這樣就不需要在每個(gè)@RequestMapping方法上加 @ResponseBody了。而且添加了一個(gè)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}";
}
}
其實(shí)現(xiàn)就是在@@RestController中加入@ResponseBody:
Java代碼
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBod
public @interface RestController {
}
這樣當(dāng)你開發(fā)Rest服務(wù)器端的時(shí)候,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來完成非阻塞,這樣的話我們也需要給它一個(gè)回調(diào)接口來拿結(jié)果; Future和Callable是一對(duì),一個(gè)消費(fèi)結(jié)果,一個(gè)產(chǎn)生結(jié)果。調(diào)用完模板后會(huì)立即返回,不會(huì)阻塞;有結(jié)果時(shí)會(huì)調(diào)用其回調(diào)。
AsyncRestTemplate默認(rèn)使用SimpleClientHttpRequestFactory,即通過java.net.HttpURLConnection實(shí)現(xiàn);另外我們也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());設(shè)置即可。
另外在開發(fā)時(shí)盡量不要自己注冊(cè)如:
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ì)的已經(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),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(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接受表單自動(dòng)封裝特性實(shí)例解析
- 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)文章
GateWay路由規(guī)則與動(dòng)態(tài)路由詳細(xì)介紹
這篇文章主要介紹了GateWay路由規(guī)則與GateWay動(dòng)態(tài)路由,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Java?SE循環(huán)一些基本練習(xí)題總結(jié)
循環(huán)語句可以在滿足循環(huán)條件的情況下,反復(fù)執(zhí)行某一段代碼,這段被重復(fù)執(zhí)行的代碼被稱為循環(huán)體語句,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java?SE循環(huán)一些基本練習(xí)題,需要的朋友可以參考下2024-03-03
Spring Bean創(chuàng)建和循環(huán)依賴
這篇文章主要介紹了Spring Bean創(chuàng)建和循環(huán)依賴,講述了Spring容器中?Bean?的創(chuàng)建過程已經(jīng)主要的方法,另外也著重分析了循環(huán)依賴的問題,需要的小伙伴可以參考一下2022-05-05
Java基本數(shù)據(jù)類型族譜與易錯(cuò)點(diǎn)梳理解析
Java有八大基本類型,很多同學(xué)只對(duì)經(jīng)常使用的int類型比較了解。有的同學(xué)是剛從C語言轉(zhuǎn)入Java學(xué)習(xí),誤以為兩者的基本數(shù)據(jù)類型完全相同,這也是大錯(cuò)特錯(cuò)的。今天這本Java基本數(shù)據(jù)類型全解析大字典,可以幫助你直接通過目錄找到你想要了解某一種基本數(shù)據(jù)類型2022-01-01
Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息的完整代碼
kakfa是我們?cè)陧?xiàng)目開發(fā)中經(jīng)常使用的消息中間件。由于它的寫性能非常高,因此,經(jīng)常會(huì)碰到讀取Kafka消息隊(duì)列時(shí)擁堵的情況,這篇文章主要介紹了Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息,需要的朋友可以參考下2023-02-02
詳解HTTP請(qǐng)求與響應(yīng)基礎(chǔ)及實(shí)例
這篇文章主要介紹了詳解HTTP請(qǐng)求與響應(yīng)基礎(chǔ)及實(shí)例的相關(guān)資料,這里對(duì)http的請(qǐng)求和響應(yīng)進(jìn)行詳細(xì)分析并附有實(shí)現(xiàn)實(shí)例,需要的朋友可以參考下2017-07-07
Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解
這篇文章主要介紹了Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Java中連接Mongodb進(jìn)行增刪改查的操作詳解
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,由C++語言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,本文給大家介紹了Java中連接Mongodb進(jìn)行操作,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-06-06
Spring bean的實(shí)例化和IOC依賴注入詳解
這篇文章主要介紹了Spring bean的實(shí)例化和IOC依賴注入詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03

