0

给定下面的 EJB,容器是否足够智能以仅创建使用的对象?

@Stateless
public class MyBean {

   @EJB
   Clazz1 obj1;

   @EJB
   Clazz2 obj2;

   public void run(int x) {

     if (x == 1)
         obj1.printCode();
     else
         obj2.printCode();

   }
 }
4

1 回答 1

0

在实例化 bean 本身之前,容器必须解决 bean 的所有依赖项(首先实例化它们)。

现在,当您调用一个方法时真正发生的事情可能会有所不同……您在这里使用的是纯 EJB,您的代码中没有任何 CDI 斑点! @EJB是依赖注入@Stateless的 EJB 注释,是“范围”的 EJB 注释。

如果您要使用 CDI 并将 Weld 作为其实现(除了 tomee 之外的所有 EE 服务器),那么您将获得任何普通范围 bean 的延迟实例化。这意味着您实际上注入了一个“空”代理对象,并且它只会在第一次访问时被实例化。

现在,我所说的 CDI 注入是什么意思 - 使用@Inject而不是@EJB. 你仍然可以拥有你的 bean @Stateless,CDI,如果它在你的应用程序中运行,然后用它自己的范围包装它。我还说您需要普通范围的 bean - 这意味着使用代理的 bean。这些几乎都是 CDI 范围,除了@Dependent. 因此它是@RequestScoped, @SessionScoped, @ApplicationScoped。您的 bean 的依赖项必须具有这些范围才能实现惰性初始化。

于 2019-02-28T14:20:55.893 回答