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代碼
- @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}";
- }
- }
其實現就是在@@RestController中加入@ResponseBody:
Java代碼
- @org.springframework.stereotype.Controller
- @org.springframework.web.bind.annotation.ResponseBody
- public @interface RestController {
- }
這樣當你開發Rest服務器端的時候,spring-mvc配置文件須要的代碼極少,可能就僅需以下一行:
Java代碼
- <context:component-scan base-package="com.sishuok.spring4"/>
- <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代碼
- @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;
- }
- };
- }
- }
很是簡單,服務器端暫停10秒再返回結果(可是服務器也是非阻塞的)。具體參考我github上的代碼。
3.二、客戶端
Java代碼
- public static void main(String[] args) {
- AsyncRestTemplate template = new AsyncRestTemplate();
- //調用完後當即返回(沒有阻塞)
- ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);
- //設置異步回調
- 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來完成非阻塞,這樣的話咱們也須要給它一個回調接口來拿結果; Future和Callable是一對,一個消費結果,一個產生結果。調用完模板後會當即返回,不會阻塞;有結果時會調用其回調。
AsyncRestTemplate默認使用SimpleClientHttpRequestFactory,即經過java.net.HttpURLConnection實現;另外咱們也可使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());設置便可。
另外在開發時儘可能不要本身註冊如:
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/>
它設計的已經足夠好,使用子元素能夠配置咱們須要的配置。
且不要使用老版本的:
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.)