HttpServletRequest到任意Spring组件的自动连接记录在哪里?

HttpServletRequest到任意Spring组件的自动连接记录在哪里?,spring,spring-boot,spring-mvc,Spring,Spring Boot,Spring Mvc,今天,我发现可以自动连接到任意的单例SpringBean @组件 公共类MyComponent{ 私有最终HttpServletRequest servletRequest; 公共MyComponent(HttpServletRequest-servletRequest){ this.servletRequest=servletRequest; } } 我还没有找到权威的源代码,但从在线搜索中可以看出,这实际上是一个包装器,它委托给运行线程的实际HttpServletRequest 例如,从2

今天,我发现可以自动连接到任意的单例SpringBean

@组件
公共类MyComponent{
私有最终HttpServletRequest servletRequest;
公共MyComponent(HttpServletRequest-servletRequest){
this.servletRequest=servletRequest;
}
}
我还没有找到权威的源代码,但从在线搜索中可以看出,这实际上是一个包装器,它委托给运行线程的实际
HttpServletRequest

例如,从2012年开始:

因此,当多个请求到达此服务时,如何将与用户请求相对应的正确httpServletRequest注入此服务对象。答案是真正的HttpServletRequest并没有被真正注入,只有一个代理被注入。代理在内部是一个引用,HttpServletRequest在某个点绑定到该引用的变量

我不清楚这是Spring的核心特性、SpringMVC的特性还是SpringBoot提供的特性

我没有幸运地找到权威来源(例如,在Spring文档、Spring的内部内容或Spring发行说明中)来解释这是一个受支持的特性,并解释它是如何工作的。我猜它就在那里,但我找不到它。如果我要使用这样的功能,我更希望有这样的背景,这样我就可以考虑何时、如何最好地使用它,以及何时避免它

此功能在哪里记录


注意:这是一个类似于的问题。然而,这只是询问这种方法的缺陷以及它是如何工作的,并没有说明它在何处或如何被记录或以其他方式指定。

自动连接HttpServletRequest的代理的可能性是Spring MVC的一部分,遗憾的是,它没有被正确记录

您可以在
SpringWeb:3.0.0
的一些发行说明中找到关于它的最好信息。例如,请看一下,特别是Juergen Hoeller(String的主要开发人员之一)谈到了自该版本以来它是如何工作的


另外,请随意查看源代码(,),它们都有很好的文档记录。

您得到的另一个答案涵盖了功能(未)文档记录的地方;它还介绍了该功能的受支持程度,因为它指出该功能现在已经进入第三个主要版本,这使得它看起来不太可能很快消失

你让我对它的工作原理感兴趣,所以我想我会把我发现的写下来。这是在一个使用
@Autowired
字段(不是构造函数注入)的裸体Spring引导应用程序中实现的,但它的许多功能也将应用于其他用例中。下面是一个详细的描述,其中有到特定代码行的链接,但首先有一个执行摘要:几乎没有任何使用的代码是特定于
HttpServletRequest
,而特定于
HttpServletRequest
的代码是涉及的最简单的代码。如果功能被删除或更改,我会感到惊讶;即使是这样,我认为,如果您愿意在应用程序上下文预刷新时乱来,您也可以自己重新创建它

因此,详细信息:当上下文刷新时,
WebApplicationContextUtils
转到
DefaultListableBeanFactory
,并且“如果有人问你从哪里可以获得ServletRequest,你可以使用此
RequestObjectFactory
”来回答他们。稍后在相同的上下文刷新期间,相同的bean工厂正在创建bean。当它到达
@组件时
,它看到它需要自动连接
HttpServletRequest
。因为这是一个接口,所以它从
RequestObjectFactory
中调用
java.lang.reflect.Proxy
,并将其分配给
@Autowired
字段

稍后,servlet容器接收应用程序servlet的请求,并通过应用程序的过滤器链发送该请求。该链中的一个过滤器是
RequestContextFilter
,它包含
RequestContextHolder
的请求属性。注意,该类使用
ThreadLocal
s;因为每个请求都在不同的线程中处理,所以没有其他线程会改变请求属性


稍后(但仍在处理相同的请求时,
@Component
的方法被调用。它依次调用
@autowiredhttpservletrequest
字段上的方法。该字段包含一个代理,因此方法调用被调度到创建代理时使用的调用处理程序。(参见上面两段的“构造”链接。)调用处理程序在
RequestObjectFactory
getObject
方法返回的任何对象上调用该方法;最后,该方法可以访问servlet容器设置的请求。

它似乎是连接这些bean及其重载的主要入口点。这由
spring-web
中的
*WebApplicationContext
类调用,并由spring-Boot中的
ServletWebServerApplicationContext
调用,以将bean添加到这些应用程序上下文中。