仅创建Java EE中使用的对象

问题描述 投票:0回答:1

鉴于下面的EJB,容器是否足够智能,只能创建使用的对象?

@Stateless
public class MyBean {

   @EJB
   Clazz1 obj1;

   @EJB
   Clazz2 obj2;

   public void run(int x) {

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

   }
 }
java java-ee ejb cdi java-ee-8
1个回答
0
投票

在实例化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的依赖关系必须要有那些范围才能实现延迟初始化。

© www.soinside.com 2019 - 2024. All rights reserved.