1

如果我创建一个带有注释的 bean,@RequestScoped我希望它会用每个新请求实例化一个新的代理实例。

另一方面,每个请求都与它自己的线程相关联。

我的问题是:如果新请求重用池中以前创建的线程,CDI 会重用我的 bean/服务以前创建的代理对象吗?

4

1 回答 1

5

首先,重要的是要了解客户端代理对象!= bean 实例(如果我们想遵循规范措辞,则为上下文实例)。对于@RequestScoped每个请求,总是会创建一个新的 bean 实例。但是,@RequestScoped是一个普通范围,这意味着注入了一个客户端代理(并且这个代理委托给了 bean 实例)。

现在回到您对客户端代理对象的问题 - 该策略是特定于实现的。规范规定容器可以为每个 bean 实例化一个客户端代理对象,并在多个注入点之间共享它。但这不是必需的(另请参阅本文档)。参考实现(Weld、WildFly、GlassFish 等)确实共享客户端代理对象。但同样,我们谈论的是客户端代理,而不是 bean 实例。

WRT 线程关联 - 请求上下文与一个线程相关联,但是当请求结束时,上下文被销毁(包括所有 bean 实例)并且线程被分离。

于 2017-12-08T10:43:42.693 回答