无法很好地理解 spring-mvc 的`@Autowired HttpServletRequest`

2024-04-26

在我们的 Spring 应用程序中,我们使用HttpServletRequest有两种方式:

(这里的代码是简化的,看起来没什么意义)

  1. 在控制器中:

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> hello(HttpServletRequest request) {
        System.out.println("## controller req.hashcode: " + request.hashCode());
        System.out.println("## header 'abc': " + request.getHeader("abc"));
        return new ResponseEntity<String>("OK", HttpStatus.OK);
    }
    
  2. 在普通组件中:

    @Component
    class RequestService {
        private final HttpServletRequest request;
        @Autowired
        public RequestService(HttpServletRequest request) {
            this.request = request;
        }
        public String getHeaderAbc() {
            System.out.println("## service req.hashcode: " + request.hashCode());
            return this.request.getHeader("abc");
        }
    }
    

起初,我认为第二种方法是完全错误的,因为它应该只注入request实例一次。所以无论我什么时候调用getHeaderAbc()方法,它应该返回相同的值(第一个请求的值)。

但当我尝试时,我发现了一些有趣的事情:

  1. The request.hashCode()控制器中总是不同的(如我所料)
  2. The request.hashCode() in RequestService总是一样的(正如我所想的)
  3. 但是如果我发出具有不同标头的请求,标头值会不同abc !!!

看来对于单身人士来说RequestService,弹簧保持request实例,但更改了它包含的标头!

怎么理解呢?


查看作用域代理。http://www.java-allandsundry.com/2012/08/spring-scoped-proxy.html http://www.java-allandsundry.com/2012/08/spring-scoped-proxy.html基本上,您注入一个代理,该代理保留对当前 HttpRequest bean 的引用,并为您提供正确的代理,通过请求 id 选择它。

恕我直言,在 Web 层之外使用 Http 请求并不是一个好的做法。我只会在控制器中使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法很好地理解 spring-mvc 的`@Autowired HttpServletRequest` 的相关文章

随机推荐

  • 使用媒体编解码器将 PCM 转换为 AAC

    我正在 Android Jelly Bean 中使用媒体编解码器类将 PCM 格式编码为 AAC 该文件已编码 但没有音乐播放器能够播放该文件 我在网上找不到任何工作代码或正确的文档 这是我的代码 public void doConvert
  • 将到期日期作为 TIMESTAMP 列的默认值

    有没有办法将列的默认值设置为过期日期 从CURRENT TIMESTAMP 我已经尝试过 ALTER TABLE table ADD COLUMN expire TIMESTAMP NOT NULL DEFAULT TIMESTAMPADD
  • Chrome 控制台和 Javascript 对象类型

    我想找到 Javascipt 对象的类型 构造函数的名称 但我一直只是用我尝试过的所有方法得到一个通用的 对象 我在网上搜索过 但没有找到对我有用的 Javascript 方法 它始终只返回对象构造函数类型作为通用 对象 然而当我在 Chr
  • Jquery 单击事件不会在使用 jquery 动态创建的元素上触发

    我正在尝试创建一个简单的功能 用户从下拉列表中选择一些值 然后单击 添加 按钮以标签的形式在下面的 div 中添加所选项目 每个添加的标签都有一个删除锚点 单击该锚点即可删除该标签 现在 当单击添加按钮时 标签将被正确插入 但是当我单击标签
  • 如何以编程方式获取 iOS 应用程序中的日志消息?

    我正在使用中定义的方法https developer apple com documentation os logging https developer apple com documentation os logging在 iOS 应用
  • Tic-Tac-Toe AI:如何制作树?

    在制作井字游戏机器人时 我在尝试理解 树 时遇到了巨大的障碍 我理解这个概念 但我不知道如何实现它们 有人可以向我展示一个如何为这种情况生成树的示例吗 或者关于生成树的好教程 我想最困难的部分是生成部分树 我知道如何实现生成整棵树 但不知道
  • ofstream 不适用于 Windows 7 隐藏文件

    我意识到ofstream不适用于 Windows 7 隐藏文件 这是快速测试代码 include
  • 更改 UINavigationController 导航栏的颜色

    我正在尝试使用以下方法更改 UINavigationController 导航栏的颜色 self navigationController navigationBar tintColor UIColor brownColor 在下面给出的代
  • 使用 Xcode 6.4 的通用自定义 iOS 框架

    我使用 Xcode 6 创建了一个自定义 iOS 框架 我尝试了许多脚本来使框架通用 对于模拟器和设备 但它们都不适合我 请建议我一种为 iOS 创建自定义通用框架的方法Xcode 6 要通过终端将两个二进制文件合并为通用二进制文件 首先编
  • Android 将原始字节记录到 WAVE 文件中以进行 Http Streaming

    所以我正在使用AudioRecord从 Android 记录原始字节并将其写入 wav 文件 由于 Android 不支持此功能 我必须使用以下代码手动编写 wav 文件头 randomAccessWriter writeBytes RIF
  • 如何检查 servlet 中的 sessionId 是否有效 (java)

    我在我的 Web 应用程序中维护 sessionid 和 HttpSession 对象的映射 我使用 HttpSessionListener 从地图中填充或删除会话 当我的网络服务器崩溃 宕机并恢复时 我需要一种方法来检查提交的 sessi
  • Android 显示全屏滑块图像

    我有一个在 Android 屏幕上显示的 gridview 图像 我的要求是滑动全屏图像 这是我的代码 图像适配器 public class ImageAdapter extends BaseAdapter private Context
  • 与 WiX 3.0 一起安装 WiX 3.5

    是否可以同时安装 WiX 3 0 和 3 5 如果我在安装 3 0 后安装 3 5 它会删除 3 0 文件 如果我尝试在 3 5 之后安装 3 0 它会告诉我已经安装了较新的版本 我正在从 VS 2008 迁移到 VS 2010 因此我的应
  • 获取已安装应用程序的位置 vb.net

    我在vb net上发布了一个应用程序 用户将能够将应用程序安装在计算机上他们选择的任何位置 或者可能不是他们选择的任何位置 而是默认位置 我如何以编程方式获取用户安装应用程序的位置 换句话说 我需要应用程序知道它从哪里运行 我如何检测到这一
  • Android 使卷轴看起来在旋转的最佳方法

    我正在为 Android 制作一个简单的水果机 老虎机 我在想如何才能让 卷轴 看起来在旋转 然后逐渐停止 我的想法是有一个环绕声 然后在顶部随机生成图像 并沿着屏幕向下移动 只有部分图像可见 任何有关想法或如何完成的帮助都将非常棒 我在这
  • Scala 中的 Reader monad:返回、本地和序列

    我正在使用ReaderScala 中的 monad 由scalaz https github com scalaz scalaz图书馆 我对这个单子很熟悉正如 Haskell 中定义的 https wiki haskell org All
  • C:函数指针转换到底是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设有人想要创建一个可以容纳多个不同类型的函数指针的数组 他将如何去做呢 也许空指针数组可以工作 事实证明 不行 因为为了使用存储在空指针中
  • 在 Chrome 扩展程序中访问 Chrome 设置

    我正在寻找开发一个 chrome 扩展程序 可以访问 wrench gt 选项 gt 引擎盖下的内容设置 那可能吗 我当时正在看API page http code google com chrome extensions api inde
  • 使用 Memcache 缓存 Matplotlib(不会 Pickle)

    我有一个图表 渲染需要 3 秒 然后可以从所述图表中添加一些内容来制作子图表 我想缓存主图表中的轴 以便稍后在渲染子图表时检索并修改它 我怎样才能克服这个错误 这是一个示例测试代码 import pylibmc cache pylibmc
  • 无法很好地理解 spring-mvc 的`@Autowired HttpServletRequest`

    在我们的 Spring 应用程序中 我们使用HttpServletRequest有两种方式 这里的代码是简化的 看起来没什么意义 在控制器中 RequestMapping value hello method RequestMethod G