给定下面的 EJB,容器是否足够智能以仅创建使用的对象?
@Stateless
public class MyBean {
@EJB
Clazz1 obj1;
@EJB
Clazz2 obj2;
public void run(int x) {
if (x == 1)
obj1.printCode();
else
obj2.printCode();
}
}
给定下面的 EJB,容器是否足够智能以仅创建使用的对象?
@Stateless
public class MyBean {
@EJB
Clazz1 obj1;
@EJB
Clazz2 obj2;
public void run(int x) {
if (x == 1)
obj1.printCode();
else
obj2.printCode();
}
}
在实例化 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 的依赖项必须具有这些范围才能实现惰性初始化。