【问题标题】:@Singleton @Inject-ed in @WebServlet seems to create multiple instances [duplicate]@WebServlet 中的@Singleton @Inject-ed 似乎创建了多个实例 [重复]
【发布时间】:2015-05-20 20:08:39
【问题描述】:

我有以下@Singleton EJB:

@Singleton
public class RunBean {

  private int id = new Random().nextInt();

  public void printID() {
    System.out.println("ID = " + id);
  }

}
@Singleton
public class ParentBean {

  @Inject
  private RunBean runBean;

  public void start() {
    runBean.printID();
  }

}

我是@Inject-ing 他们在下面的 web servlet 中:

public class Servlet extends HttpServlet {

  @Inject
  private RunBean runBean;

  @Inject
  private ParentBean parentBean;

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      runBean.printID();  // out: ID = 69743
      parentBean.start(); // out: ID = 193
  }

}

我希望看到打印的 ID 相同。为什么它们不同?

【问题讨论】:

  • 那是@javax.ejb.Singleton吗?
  • 是的,那是什么注释类。
  • 我怀疑你可能是 CDI 怪癖的受害者:要么只使用 @EJB 将你的单例注入任何地方(而不是 @Inject),要么将 @ApplicationScoped 添加到你的 @Singletons 和继续使用@Inject
  • 好的,谢谢。 RunBean 是javax.inject.Singleton。但是ParentBean是com.google.inject.Singleton(这个实现需要用到库)。所以我不能在com.google.inject.Singleton 中注入 CDI Singleton?但我需要他在那里。我应该怎么做才能得到豆子?使用new initialcontext().lookup?
  • 您是否将应用程序部署在 Java EE 容器上?还是您使用 3rd 方库进行注入(例如:guice)?

标签: jakarta-ee singleton ejb cdi


【解决方案1】:

您应该只在 JavaEE 7 或更高版本的服务器上使用 @Inject EJB(例如您的 @Singleton bean)。

在 Java EE6 环境中,您必须使用 @EJB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2014-08-11
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多