spring4新特性之web开发增强

发布时间 - 2026-01-11 03:16:25    点击率:

从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开发增强,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# spring  # web开发  # Spring事物的传播特性详解  # Spring Boot 2.4新特性减少95%内存占用问题  # Spring Boot 2.4 新特性之一键构建Docker镜像的过程详解  # spring5新特性全面介绍  # SpringBoot新特性之全局懒加载机制  # 全面解析Spring Security 过滤器链的机制和特性  # SpringBoot2.3新特性优雅停机详解  # Spring MVC接受表单自动封装特性实例解析  # SpringBoot2.0新特性之配置绑定全解析  # Spring各版本新特性的介绍  # Intellij IDEA 2017新特性之Spring Boot相关特征介绍  # 简单了解Spring Framework5.0新特性  # 浅析Spring4新特性概述  # Spring 4 支持的 Java 8 特性  # java Spring 5 新特性函数式Web框架详细介绍  # 详解Spring工厂特性  # 回调  # 客户端  # 小编  # 都是  # 是在  # 在此  # 就不  # 当你  # 给大家  # 为其  # 可以使用  # 后会  # 极少  # 来完成  # 所述  # 完后  # 给它  # 给我留言  # 仅需  # 配置文件 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  教你用AI将一段旋律扩展成一首完整的曲子  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  JS去除重复并统计数量的实现方法  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  JavaScript实现Fly Bird小游戏  网站制作价目表怎么做,珍爱网婚介费用多少?  bing浏览器学术搜索入口_bing学术文献检索地址  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Android Socket接口实现即时通讯实例代码  php打包exe后无法访问网络共享_共享权限设置方法【教程】  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何用低价快速搭建高质量网站?  如何在阿里云完成域名注册与建站?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  如何用AI帮你把自己的生活经历写成一个有趣的故事?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  免费网站制作appp,免费制作app哪个平台好?  再谈Python中的字符串与字符编码(推荐)  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  如何在阿里云通过域名搭建网站?  IOS倒计时设置UIButton标题title的抖动问题  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  PythonWeb开发入门教程_Flask快速构建Web应用  魔毅自助建站系统:模板定制与SEO优化一键生成指南  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Linux系统运维自动化项目教程_Ansible批量管理实战  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何用已有域名快速搭建网站?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何在腾讯云服务器上快速搭建个人网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel如何处理和验证JSON类型的数据库字段  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  zabbix利用python脚本发送报警邮件的方法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?