鉴于下面的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
是依赖注入的EJB注释,@Stateless
是“范围”的EJB注释。
如果您使用CDI并将Weld作为其实现(除了tomee之外的所有EE服务器),那么您将获得任何正常范围bean的延迟实例化。这意味着你实际上注入了一个“空”代理对象,它只会在第一次访问时被实例化。
现在,我的意思是CDI注射 - 使用@Inject
而不是@EJB
。你仍然可以拥有你的bean @Stateless
,CDI,如果它在你的应用程序中运行,然后用它自己的范围包装它。我还说过你需要普通的scoped bean - 这意味着使用代理的bean。这些除了@Dependent
之外几乎都是CDI范围。因此它是@RequestScoped
,@SessionScoped
,@ApplicationScoped
。 bean的依赖关系必须要有那些范围才能实现延迟初始化。