Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同一会话中Sessionscoped bean的多个实例_Java_Dependency Injection_Ejb_Cdi - Fatal编程技术网

Java 同一会话中Sessionscoped bean的多个实例

Java 同一会话中Sessionscoped bean的多个实例,java,dependency-injection,ejb,cdi,Java,Dependency Injection,Ejb,Cdi,如果在同一个会话中我实例化了多个SessionScoped Bean或EJB(第一次通过容器注入,第二次通过“new”创建),会发生什么? 它会抛出错误吗? 如果没有,注射期间将使用哪种药物? 同样适用于applicationScoped和RequestScoped p.S.类没有任何注释,请给它们一个明确的名称。要有一个真正的托管bean,您可以让CDI处理包括创建在内的生命周期。当然也有例外,但我们现在不要讨论这个问题 对于您的情况,通过new创建的对象不会是托管bean,CDI也不会知道它

如果在同一个会话中我实例化了多个SessionScoped Bean或EJB(第一次通过容器注入,第二次通过“new”创建),会发生什么? 它会抛出错误吗? 如果没有,注射期间将使用哪种药物? 同样适用于applicationScoped和RequestScoped


p.S.类没有任何注释,请给它们一个明确的名称。

要有一个真正的托管bean,您可以让CDI处理包括创建在内的生命周期。当然也有例外,但我们现在不要讨论这个问题

对于您的情况,通过
new
创建的对象不会是托管bean,CDI也不会知道它(除非它是某种生产者方法或类似方法的结果)。 您应该弄清楚为什么要创建它,而不是仅仅注入现有的一个

同样适用于applicationScoped和RequestScoped

对于普通作用域bean的每个注入点,CDI都会查看底层的“bean存储”,看看您想要的bean是否已经创建并存储在那里。如果是这样的话,它只会返回那个(或者它的代理)。如果没有,它将创建一个新的,并将其存储在那里以供将来参考


所以简单的回答是,CDI不会创建同一个普通作用域bean的两个实例。

为什么要实例化多个SessionScoped bean?我不想,但我在旧代码中看到了它。我想知道发生了什么,并试图理解为什么doit.Spring没有被标记,但在Spring下,相同类型的多个bean可以通过使用唯一的名称来解析,这样每个实例都可以按名称注入,而不仅仅依赖于类型。Spring还有其他选项,例如使用@Primary-有关详细信息,请参阅。如果Spring无法解决bean依赖关系,那么应用程序将不会启动。Spring不是这样,但很高兴知道。在我的例子中,类没有显式的名称。我会更新我的问题。ThnX不确定“实例化多个SessionScoped Bean”是什么意思。正确管理的SessionScoped bean不应该被实例化,而应该被注入,这意味着容器正在处理是从池中向您提供一个bean,还是在需要时创建一个新的bean。如果您正确地让容器为您管理bean,那么每次都应该在“会话”范围内得到相同的bean。如果您通过“new”直接实例化它,它实际上不是SessionScoped,而是一个非托管pojo。我认为这是这个问题的正确答案。我仍然不知道这样做的原因是什么。我以为有什么模式,但据我所知,没有。谢谢你。