我是Java EE的新手,我无法弄清楚为什么我更喜欢JNDI查找而不是注入有状态会话bean? (这就是我在关于它的课程幻灯片上阅读的内容)
答案 0 :(得分:5)
通常,当您处于不支持注入的上下文中时,正在执行JNDI查找。
如果您处于上下文中,仍有几个原因。一个是当你注入的bean将被序列化时,并且在反序列化之后不知道如何再次重新注入(当在客户端上使用状态时,这发生在JSF本机托管bean上)。
这最后一个原因可能是老师想到的原因。有状态会话bean可以被钝化(之后它们将被序列化),并且在某些情况下,您可能也不希望注入的资源也被序列化。在这种情况下,您不会将资源存储在实例变量中,但每次需要时都会从JNDI请求一个新资源。
另一个原因是,使用JNDI,您可以以编程方式决定要检索哪个bean,但这不是特定于有状态会话bean,并且适用于任何类型的注入。
注意,上面主要是关于注入INTO有状态会话bean。正如Miljen正确陈述的那样,还存在将有状态会话bean注入某些东西的问题。如果你不还指定范围的SFSB(通过CDI的@SessionScope,@RequestScope等),然后注入一个Servlet或其他共享资源(如应用程序范围内管理的bean)将公开相同SFSB给所有用户,这是你最不想要的东西。
如果您不能使用CDI(例如,您可能只是不知道它存在),那么通过JNDI获取SFSB是一种解决方法。如果你想保持状态比单个方法调用更长,那么你必须将它存储在某个地方,例如在HTTP会话中。
答案 1 :(得分:3)
让我们假设您正试图在SFSB上获取参考资料。 servlet的。你有什么选择?
a)使用@EJB注释注入EJB
b)JNDI查找
选项a)将为您提供相同的引用,这些引用将在特定servlet的所有调用中共享。可能,或者绝对不是你想要的行为。选项b)是您的选择,因为您可以获得新的SFSB参考每个请求,并且只有在您完成调用之后才能保留它。