spring4新特性之web开发增强

 更新时间:2017年09月15日 11:25:44   作者:动力节点  
这篇文章主要介绍了spring4新特性之web开发增强的相关资料,需要的朋友可以参考下

从Spring4开始,Spring以Servlet3为进行开发,如果用Spring MVC 测试框架的话需要指定Servlet3兼容的jar包(因为其Mock的对象都是基于Servlet3的)。另外为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。而且添加了一个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}"; 
  } 
} 

 其实现就是在@@RestController中加入@ResponseBody:

Java代码 

@org.springframework.stereotype.Controller 
@org.springframework.web.bind.annotation.ResponseBod 
public @interface RestController { 
} 

这样当你开发Rest服务器端的时候,spring-mvc配置文件需要的代码极少,可能就仅需如下一行:

Java代码  

<context:component-scan base-package="com.bjpowernode.spring4"/> 
<mvc:annotation-driven/>  

2、mvc:annotation-driven配置变化

统一风格;将 enableMatrixVariables改为enable-matrix-variables属性;将ignoreDefaultModelOnRedirect改为ignore-default-model-on-redirect。

3、提供AsyncRestTemplate用于客户端非阻塞异步支持。

3.1、服务器端

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.2、客户端

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

总结

以上所述是小编给大家介绍的spring4新特性之web开发增强,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • idea重新下载已删除的maven依赖包操作

    idea重新下载已删除的maven依赖包操作

    这篇文章主要介绍了idea重新下载已删除的maven依赖包操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • GateWay路由规则与动态路由详细介绍

    GateWay路由规则与动态路由详细介绍

    这篇文章主要介绍了GateWay路由规则与GateWay动态路由,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Java SE循环一些基本练习题总结

    Java SE循环一些基本练习题总结

    循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,下面这篇文章主要给大家总结介绍了关于Java SE循环一些基本练习题,需要的朋友可以参考下
    2024-03-03
  • Spring Bean创建和循环依赖

    Spring Bean创建和循环依赖

    这篇文章主要介绍了Spring Bean创建和循环依赖,讲述了Spring容器中 Bean 的创建过程已经主要的方法,另外也着重分析了循环依赖的问题,需要的小伙伴可以参考一下
    2022-05-05
  • Java基本数据类型族谱与易错点梳理解析

    Java基本数据类型族谱与易错点梳理解析

    Java有八大基本类型,很多同学只对经常使用的int类型比较了解。有的同学是刚从C语言转入Java学习,误以为两者的基本数据类型完全相同,这也是大错特错的。今天这本Java基本数据类型全解析大字典,可以帮助你直接通过目录找到你想要了解某一种基本数据类型
    2022-01-01
  • Spring Boot 中使用@KafkaListener并发批量接收消息的完整代码

    Spring Boot 中使用@KafkaListener并发批量接收消息的完整代码

    kakfa是我们在项目开发中经常使用的消息中间件。由于它的写性能非常高,因此,经常会碰到读取Kafka消息队列时拥堵的情况,这篇文章主要介绍了Spring Boot 中使用@KafkaListener并发批量接收消息,需要的朋友可以参考下
    2023-02-02
  • 详解HTTP请求与响应基础及实例

    详解HTTP请求与响应基础及实例

    这篇文章主要介绍了详解HTTP请求与响应基础及实例的相关资料,这里对http的请求和响应进行详细分析并附有实现实例,需要的朋友可以参考下
    2017-07-07
  • Java强制保留两位小数的四种方法案例详解

    Java强制保留两位小数的四种方法案例详解

    这篇文章主要介绍了Java强制保留两位小数的四种方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java中连接Mongodb进行增删改查的操作详解

    Java中连接Mongodb进行增删改查的操作详解

    MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案,本文给大家介绍了Java中连接Mongodb进行操作,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-06-06
  • Spring bean的实例化和IOC依赖注入详解

    Spring bean的实例化和IOC依赖注入详解

    这篇文章主要介绍了Spring bean的实例化和IOC依赖注入详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论