专栏首页一个会写诗的程序员的博客SpringMVC 自动注入 Request 和 Response 对象

SpringMVC 自动注入 Request 和 Response 对象

问题

当我们第一次接触到 Java Web 开发,从最原生的 Servlet 方法开始,我们就知道在 doGet() 或者 doPost() 方法有两个形参,分别是 HttpServletRequest 和 HttpServletResponse,这两个参数代表了 web 容器为我们封装的 HTTP 请求和 HTTP 响应。

当 Java Web 进化到 SpringMVC 中,一系列的杂活脏活都交给了 DispatcherServlet 前端控制器来处理。

回到正文,传统情况下,我们访问一个接口,想要从中取得 request 对象,或者是 response 对象,亦或者是 httpSession 对象,都是直接作为形参传进来。举个例子,前端传递 token,先经过 filter 得到用户ID,并将它存入 request 中,那么在每个接口中取得用户ID,都要这样:

@GetMapping(/"test")
public ResponseResult test(HttpServletRequest request, HttpServletResponse response) {
    Object userId = request.getAttribute("userId");
    ...
}

每个接口都要加 HttpServletRequest 或者 HttpServletResponse,第一写起来麻烦,第二看起来参数也很多。那么既然 Spring 可以依赖注入,我们可不可以这样做呢:

@RestController
public class DemoController {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;

    @GetMapping("/test")
    public ResponseResult test() {
        Object userId = request.getAttribute("userId");
        ...
    }
}

可以.

既然我可以将它 Autowired 出来,那么它是啥时候被注入的呢? 我们知道 Spring 容器中的 Bean 默认是单例的,那么这样得到的 request 会不会有问题?并发情况下,一个接口会不会取到另一个接口的 request?

结论

  1. 啥时候注入的?

答:SpringMVC DispatcherServlet 每次处理 HTTP 请求时,会将 web 容器封装的 request 和 response 注入到 Spring 容器中。

  1. 这样在并发情况下会不会有问题?

答:不会有问题。内部其实存在一个 ThreadLocal ,不同进程的 request 和 response 是隔离的。

  1. 那我们以后是不是可以都这样写了?

答:理论上且实际上这样写都没有问题,但是一般认为接口形参上的 request 和 response 对应着一次 HTTP 请求,因此用注入的方式会让人感觉有点奇怪。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JS中的phototypeJS中的phototype

    原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。

    一个会写诗的程序员
  • 创业启动第一步,就是写一份规范的商业计划书(BP)

    商业计划书(BP)是创业者靠谱而又有激情的“idea”+完整的逻辑表达,甚至成为初创公司与投资机构交流的重要载体,决定了VC对于该项目的第一印象,有时甚至成为初...

    一个会写诗的程序员
  • Kotlin 问答Kotlin 问答《Kotlin极简教程》正式上架:

    可控类型特性,大大减少了 Java 中的 NPE。 代码量大幅度精简。 100% 兼容 Java。 更好的函数式编程支持。

    一个会写诗的程序员
  • flask中请求勾子

    在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:     *在请求开始时,建立数据库连接;     *在请求开始时,根据需求进行权限校验;...

    py3study
  • flask之请求钩子

    skylark
  • Ajax设置请求和接收响应、自己封装简易jQuery.Ajax、回调函数

    这篇文章是承接前几篇博客的,是前几篇继续学习 包括Ajax学习与理解和简化版自己实现jQuery等 这篇文章只算是我的个人学习笔记,内容没有精心排版,一些错误请...

    代码之风
  • Servlet第四篇【request对象常用方法、应用】

    什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所...

    Java3y
  • python 终极篇 --- django

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

    py3study
  • [048]Block Layer层架构演变(个人YY)

    Block Layer层在整个I/O中负责承上启下,上接文件系统,下接块驱动。 我不想直接讨论代码,希望从一个架构的演变来初探一下Block Layer层。

    王小二
  • Pyramid中的request和response1.Request2.Multidict3.Response

    官方API:pyramid.request、pyramid.response 和 pyramid.httpexceptions。

    意气相许的许

扫码关注云+社区

领取腾讯云代金券