javascript
Spring4新特性——Web开发的增强
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
Spring4新特性——泛型限定式依賴注入
Spring4新特性——核心容器的其他改進
Spring4新特性——Web開發(fā)的增強
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC?
Spring4新特性——Groovy Bean定義DSL
Spring4新特性——更好的Java泛型操作API?
Spring4新特性——JSR310日期API的支持
Spring4新特性——注解、腳本、任務、MVC等其他特性改進?
?
從Spring4開始,Spring以Servlet3為進行開發(fā),如果用Spring MVC 測試框架的話需要指定Servlet3兼容的jar包(因為其Mock的對象都是基于Servlet3的)。另外為了方便Rest開發(fā),通過新的@RestController指定在控制器上,這樣就不需要在每個@RequestMapping方法上加?@ResponseBody了。而且添加了一個AsyncRestTemplate?,支持REST客戶端的異步無阻塞支持。
?
1、@RestController
@RestController public class UserController {private UserService userService;@Autowiredpublic 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:
@org.springframework.stereotype.Controller @org.springframework.web.bind.annotation.ResponseBody public @interface RestController { }這樣當你開發(fā)Rest服務器端的時候,spring-mvc配置文件需要的代碼極少,可能就僅需如下一行:
<context:component-scan base-package="com.sishuok.spring4"/><mvc:annotation-driven/>??
2、mvc:annotation-driven配置變化
統(tǒng)一風格;將?enableMatrixVariables改為enable-matrix-variables屬性;將ignoreDefaultModelOnRedirect改為ignore-default-model-on-redirect。
?
3、提供AsyncRestTemplate用于客戶端非阻塞異步支持。
3.1、服務器端
對于服務器端的springmvc開發(fā)可以參考https://github.com/zhangkaitao/servlet3-showcase中的chapter3-springmvc
@RestController public class UserController {private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@RequestMapping("/api")public Callable<User> api() {System.out.println("=====hello");return new Callable<User>() {@Overridepublic User call() throws Exception {Thread.sleep(10L * 1000); //暫停兩秒User user = new User();user.setId(1L);user.setName("haha");return user;}};} }非常簡單,服務器端暫停10秒再返回結果(但是服務器也是非阻塞的)。具體參考我github上的代碼。
?
3.2、客戶端
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);//設置異步回調(diào)future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {@Overridepublic void onSuccess(ResponseEntity<User> result) {System.out.println("======client get result : " + result.getBody());}@Overridepublic void onFailure(Throwable t) {System.out.println("======client failure : " + t);}});System.out.println("==no wait");}?此處使用Future來完成非阻塞,這樣的話我們也需要給它一個回調(diào)接口來拿結果; Future和Callable是一對,一個消費結果,一個產(chǎn)生結果。調(diào)用完模板后會立即返回,不會阻塞;有結果時會調(diào)用其回調(diào)。
?
AsyncRestTemplate默認使用SimpleClientHttpRequestFactory,即通過java.net.HttpURLConnection實現(xiàn);另外我們也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());設置即可。
?
另外在開發(fā)時盡量不要自己注冊如:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">盡量使用
<mvc:annotation-driven/>它設計的已經(jīng)足夠好,使用子元素可以配置我們需要的配置。
??
且不要使用老版本的:
<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.)??
轉載于:https://my.oschina.net/qjx1208/blog/200805
總結
以上是生活随笔為你收集整理的Spring4新特性——Web开发的增强的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019已过半,薪资相匹配除了实力,其实
- 下一篇: LeetCode.917-只反转字母(R