Создавать только объекты, используемые в Java EE - PullRequest
0 голосов
/ 23 февраля 2019

Учитывая EJB ниже, будет ли контейнер достаточно умным, чтобы создавать только используемый объект?

@Stateless
public class MyBean {

   @EJB
   Clazz1 obj1;

   @EJB
   Clazz2 obj2;

   public void run(int x) {

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

   }
 }

1 Ответ

0 голосов
/ 28 февраля 2019

Контейнеру придется разрешить все зависимости компонента (сначала создать их экземпляр) перед созданием самого компонента.

Теперь то, что действительно происходит при вызове метода, может отличаться ... Вы используете исключительно EJBздесь, в вашем коде нет ни капли CDI! @EJB - это аннотация EJB для внедрения зависимостей, а @Stateless - это аннотация EJB для "области действия".

Если бы вы использовали CDI и использовали Weld в качестве его реализации (все EE-серверы, кроме tomee), то вы получите ленивый экземпляр для любого обычного bean-объекта bean-объекта.Это будет означать, что вы фактически внедрите «пустой» прокси-объект, и он будет создан только при первом доступе.

Теперь, что я имею в виду под инъекцией CDI - используйте @Inject вместо @EJB.Вы по-прежнему можете иметь свой bean @Stateless, CDI, если он работает в вашем приложении, то оборачивает его своей собственной областью действия.Я также сказал, что вам нужны нормальные bean-компоненты с бобами - это означает, что бины используют проксиЭто почти все области применения CDI, кроме @Dependent.Поэтому это @RequestScoped, @SessionScoped, @ApplicationScoped.Зависимости вашего bean-компонента должны иметь эти области для достижения ленивого init.

...