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.)