Spring4新特性——Web開發的加強

Spring4新特性——泛型限定式依賴注入 java

Spring4新特性——核心容器的其餘改進 git

Spring4新特性——Web開發的加強 github

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC  web

Spring4新特性——Groovy Bean定義DSL spring

Spring4新特性——更好的Java泛型操做API  apache

Spring4新特性——JSR310日期API的支持 api

Spring4新特性——註解、腳本、任務、MVC等其餘特性改進  spring-mvc

 

從Spring4開始,Spring以Servlet3爲進行開發,若是用Spring MVC 測試框架的話須要指定Servlet3兼容的jar包(由於其Mock的對象都是基於Servlet3的)。另外爲了方便Rest開發,經過新的@RestController指定在控制器上,這樣就不須要在每一個@RequestMapping方法上加 @ResponseBody了。並且添加了一個AsyncRestTemplate ,支持REST客戶端的異步無阻塞支持。 服務器

 

一、@RestController mvc

Java代碼   收藏代碼
  1. @RestController  
  2. public class UserController {  
  3.     private UserService userService;  
  4.     @Autowired  
  5.     public UserController(UserService userService) {  
  6.         this.userService = userService;  
  7.     }  
  8.     @RequestMapping("/test")  
  9.       public User view() {  
  10.         User user = new User();  
  11.         user.setId(1L);  
  12.         user.setName("haha");  
  13.         return user;  
  14.     }  
  15.   
  16.     @RequestMapping("/test2")  
  17.     public String view2() {  
  18.         return "{\"id\" : 1}";  
  19.     }  
  20. }  

 其實現就是在@@RestController中加入@ResponseBody:

Java代碼   收藏代碼
  1. @org.springframework.stereotype.Controller  
  2. @org.springframework.web.bind.annotation.ResponseBody  
  3. public @interface RestController {  
  4. }  

這樣當你開發Rest服務器端的時候,spring-mvc配置文件須要的代碼極少,可能就僅需以下一行:

Java代碼   收藏代碼
  1. <context:component-scan base-package="com.sishuok.spring4"/>  
  2. <mvc:annotation-driven/>  

  

二、mvc:annotation-driven配置變化

統一風格;將 enableMatrixVariables改成enable-matrix-variables屬性;將ignoreDefaultModelOnRedirect改成ignore-default-model-on-redirect。

 

三、提供AsyncRestTemplate用於客戶端非阻塞異步支持。

3.一、服務器端

對於服務器端的springmvc開發能夠參考https://github.com/zhangkaitao/servlet3-showcase中的chapter3-springmvc

Java代碼   收藏代碼
  1. @RestController  
  2. public class UserController {  
  3.     private UserService userService;  
  4.     @Autowired  
  5.     public UserController(UserService userService) {  
  6.         this.userService = userService;  
  7.     }  
  8.     @RequestMapping("/api")  
  9.       public Callable<User> api() {  
  10.         System.out.println("=====hello");  
  11.         return new Callable<User>() {  
  12.             @Override  
  13.             public User call() throws Exception {  
  14.                 Thread.sleep(10L * 1000); //暫停兩秒  
  15.                 User user = new User();  
  16.                 user.setId(1L);  
  17.                 user.setName("haha");  
  18.                 return user;  
  19.             }  
  20.         };  
  21.     }  
  22. }  

很是簡單,服務器端暫停10秒再返回結果(可是服務器也是非阻塞的)。具體參考我github上的代碼。

 

3.二、客戶端

Java代碼   收藏代碼
  1. public static void main(String[] args) {  
  2.     AsyncRestTemplate template = new AsyncRestTemplate();  
  3.     //調用完後當即返回(沒有阻塞)  
  4.     ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);  
  5.     //設置異步回調  
  6.     future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {  
  7.         @Override  
  8.         public void onSuccess(ResponseEntity<User> result) {  
  9.             System.out.println("======client get result : " + result.getBody());  
  10.         }  
  11.   
  12.         @Override  
  13.         public void onFailure(Throwable t) {  
  14.             System.out.println("======client failure : " + t);  
  15.         }  
  16.     });  
  17.     System.out.println("==no wait");  
  18. }  

 此處使用Future來完成非阻塞,這樣的話咱們也須要給它一個回調接口來拿結果; Future和Callable是一對,一個消費結果,一個產生結果。調用完模板後會當即返回,不會阻塞;有結果時會調用其回調。

 

AsyncRestTemplate默認使用SimpleClientHttpRequestFactory,即經過java.net.HttpURLConnection實現;另外咱們也可使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());設置便可。

 

另外在開發時儘可能不要本身註冊如:

Java代碼   收藏代碼
  1. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  
  2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  

儘可能使用

Java代碼   收藏代碼
  1. <mvc:annotation-driven/>   

它設計的已經足夠好,使用子元素能夠配置咱們須要的配置。

  

且不要使用老版本的:

Java代碼   收藏代碼
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>  
  2. <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.)
相關文章
相關標籤/搜索