4

我对 Java EE 很陌生,我不明白为什么我应该更喜欢 JNDI 查找而不是有状态会话 bean 的注入?(这就是我在关于它的课程幻灯片上读到的)

4

2 回答 2

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 会话中。

于 2012-11-11T14:32:40.137 回答
3

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

a) 使用@EJB 注解注入 EJB

b) JNDI 查找

选项 a) 将为您提供相同的引用,该引用将在特定 servlet 的所有调用中共享。可能或绝对不是您想要的行为。选项 b) 是您的选择,因为您可以获得每个请求的新 SFSB 参考,并仅保留它直到您完成调用。

于 2012-11-11T14:35:53.467 回答