如果我创建一个用@RequestScoped
注释的bean,我希望它会为每个新请求实例化一个新的代理实例。
另一方面,每个请求都与自己的线程相关联。
我的问题是:如果新请求重用以前在池中创建的线程,CDI会重用以前创建的bean / service的代理对象吗?
答案 0 :(得分:5)
首先,了解客户端代理对象!= bean实例(或者如果我们想要遵循规范措辞的上下文实例),这一点很重要。对于@RequestScoped
,始终为每个请求创建一个新的bean实例。但是,@RequestScoped
是正常范围,这意味着注入了客户端代理(并且此代理委托给bean实例)。
现在回到客户端代理对象的问题 - 该策略是特定于实现的。该规范声明容器可以为每个bean实例化一个客户端代理对象,并在多个注入点之间共享它。但这不是必需的(另见this documentation)。参考实现(Weld,WildFly,GlassFish等) DOES共享客户端代理对象。但同样,我们谈论的是客户端代理,而不是bean实例。
WRT线程关联 - 请求上下文与一个线程相关联,但是当请求结束时,上下文被销毁(包括所有bean实例)并且线程被分离。