如果我创建一个用 @RequestScoped
注释的 bean,我希望它会为每个新请求实例化一个新的代理实例。
另一方面,每个请求都与它自己的线程相关联。
我的问题是:如果新请求重用池中先前创建的线程,CDI 是否会重用我的 bean/服务先前创建的代理对象?
最佳答案
首先,了解客户端代理对象 != bean 实例(如果我们要遵循规范措辞,则为上下文实例)很重要。对于 @RequestScoped
,总是为每个请求创建一个新的 bean 实例。但是,@RequestScoped
是一个普通范围,这意味着注入(inject)了一个客户端代理(并且这个代理委托(delegate)给 bean 实例)。
现在回到您对客户端代理对象的问题 - 该策略是特定于实现的。该规范指出,容器可以为每个 bean 实例化一个客户端代理对象,并在多个注入(inject)点之间共享它。但这不是必需的(另请参阅 this documentation )。引用实现(Weld、WildFly、GlassFish 等)确实共享 客户端代理对象。但同样,我们谈论的是客户端代理,而不是 bean 实例。
WRT 线程关联 - 请求上下文与一个线程关联,但当请求结束时,上下文被销毁(包括所有 bean 实例)并且线程被分离。
关于java - CDI 是否为 RequestScoped 重用代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47711466/