不,因为它不会是一个问题,它不应该用于其他请求范围的bean。基本上,Spring将生成一个代理,该代理包装某种(for)(YMMV)知道如何检索实际实例。当您使用此代理的任何方法时,它们将委派给该实例。HttpServletRequest
HttpServletRequest
ObjectFactory
RequestObjectFactory
HttpServletRequest
更重要的是,这是懒惰地完成的,因此在初始化时不会失败。但是,如果您在没有可用的请求(或者尚未注册 )时尝试使用 Bean,它将失败。RequestScope
以下是对评论的回应,并一般澄清。
关于@Scope
的属性或 XML 等效项,默认值为 ScopedProxyMode.NO
。但是,正如javadoc所述proxy-mode
当与非单例作用域实例一起使用时,此代理模式通常没有用处,如果要将其用作依赖项,则应倾向于使用 INTERFACES 或TARGET_CLASS代理模式。
对于请求范围的 Bean,此值将不起作用。您需要使用 OR,具体取决于所需的配置。proxy-mode
INTERFACES
TARGET_CLASS
设置为(使用常量WebApplicationContext.SCOPE_REQUEST
),Spring将使用RequestScope
scope
request
依赖于线程绑定实例,该实例可以通过 或 导出。RequestAttributes
RequestContextListener
RequestContextFilter
DispatcherServlet
让我们举一个简单的例子
@Component
@Scope(proxyMode = ScopedProxyMode.INTERFACES, value = WebApplicationContext.SCOPE_REQUEST)
public class RequestScopedBean {
public void method() {}
}
...
@Autowired
private RequestScopedBean bean;
Spring 将生成两个 Bean 定义:一个用于注入的 Bean,一个单例定义,另一个用于在每个请求上生成的请求范围 Bean。
从这些bean定义中,Spring会将单例初始化为具有目标类类型的代理。在此示例中,即 。代理将包含在需要时生成或返回实际Bean所需的状态,即。在代理上调用方法时。例如,当RequestScopedBean
bean.method();
被调用。
此状态基本上是对请求范围的 Bean 定义的基础和名称的引用。它将使用这两个来生成一个新的 Bean,然后调用该实例。BeanFactory
method()
文档说明
Spring IoC 容器不仅管理对象(Bean)的实例化,还管理协作者(或依赖项)的连接。如果要将 HTTP 请求作用域 Bean 注入(例如)到另一个 Bean 中,则必须注入 AOP 代理来代替作用域 Bean。也就是说,您需要注入一个代理对象,该对象公开与作用域内对象相同的公共接口,但也可以从相关作用域(例如,HTTP 请求)中检索真实的目标对象,并将方法调用委托给真实对象。
如果正确实现,所有预先加载的请求范围的Bean都将是代理。同样,未预先加载的请求范围 Bean 要么是代理本身,要么是通过代理加载。如果没有绑定到当前线程,这将失败。基本上,对于请求范围的Bean,Bean依赖关系链中的某个地方需要代理。HttpSerlvetRequest