Jakarta ee 对于有状态会话bean,为什么更喜欢JNDI查找而不是EJB注入?

Jakarta ee 对于有状态会话bean,为什么更喜欢JNDI查找而不是EJB注入?,jakarta-ee,ejb-3.0,jndi,stateful-session-bean,Jakarta Ee,Ejb 3.0,Jndi,Stateful Session Bean,我对JavaEE非常陌生,我不明白为什么对于有状态会话bean,我更喜欢JNDI查找而不是注入?(这是我在一节课的幻灯片上读到的)一般来说,当您处于不支持注入的上下文中时,会执行JNDI查找 如果你所处的环境确实如此,还有几个原因。一种情况是,您注入的bean将被序列化,并且在反序列化之后不知道如何再次注入(当在客户端上使用state时,JSF本机托管bean会发生这种情况) 这最后一个原因可能就是老师心中的原因。有状态会话bean可以被钝化(之后它们将被序列化),并且在某些情况下,您可能不希望

我对JavaEE非常陌生,我不明白为什么对于有状态会话bean,我更喜欢JNDI查找而不是注入?(这是我在一节课的幻灯片上读到的)

一般来说,当您处于不支持注入的上下文中时,会执行JNDI查找

如果你所处的环境确实如此,还有几个原因。一种情况是,您注入的bean将被序列化,并且在反序列化之后不知道如何再次注入(当在客户端上使用state时,JSF本机托管bean会发生这种情况)

这最后一个原因可能就是老师心中的原因。有状态会话bean可以被钝化(之后它们将被序列化),并且在某些情况下,您可能不希望注入的资源也被序列化。在这种情况下,您不会将资源存储在实例变量中,而是在每次需要时从JNDI请求一个新的实例变量

另一个原因是,使用JNDI,您可以通过编程方式决定检索哪个bean,但这并不特定于有状态会话bean,而是适用于任何地方的所有类型的注入

注意,上面的内容主要是关于注入到有状态会话bean中。正如上面Miljen正确指出的那样,还有将有状态会话bean注入到某些内容中的问题。如果您没有将作用域分配给SFSB(通过CDI的@SessionScope、@RequestScope等),那么注入Servlet或其他共享资源(如应用程序范围的托管bean)将向所有用户公开相同的SFSB,这是您最不希望看到的


如果您不能使用CDI(例如,您可能只是不知道它的存在),那么通过JNDI获得SFSB是一种解决方法。如果您想将状态保持在一个方法调用之外的时间,那么您必须将其存储在某个地方,例如HTTP会话中。

假设您正在尝试获取SFSB上的引用,例如servlet中的引用。你有什么选择

a) 使用@EJB注释注入EJB

b) JNDI查找


选项a)将为您提供在特定servlet的所有调用中共享的相同引用。可能,或者肯定,不是你想要的行为。选项b)是您的选择,因为您可以根据每个请求获取新的SFSB引用,并将其保留到调用完成为止。

源是什么(您提到的幻灯片)?我的课堂幻灯片之一。只有一行写着只使用查找而不是注入。没什么了,我要过几天才能问老师。所以我想你们可以帮我回答这个问题。谢谢,如果我查找一个ejb,它会为同一个http会话返回同一个实例吗?@bitec http会话通常由多个http请求和响应组成。每个请求都可以获得一个新的SFSB实例!这是SFSB最令人恼火的事情。如果对于我的http会话,它们将返回不同的SFSB,那么为什么命名为“会话”和“有状态”呢。我在这里看到了将SFSB引用放在Http会话属性中以获得具有相关状态的真正“会话bean”的建议。胡说为什么不使用@EJB注释来创建将请求转发到匹配bean的代理引用?与ThreadLocal类似,但用于会话,而不是线程。@bitec我同意,但请记住SFSB中的“会话”并不意味着“HTTP会话”。您需要这两者之间的映射,有关详细信息,请参阅此Arjan的答案: