Создавать только объекты, используемые в Java EE
Учитывая 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 ответ
Контейнеру придется разрешить все зависимости компонента (сначала создать их экземпляр) перед созданием самого компонента.
Теперь то, что действительно происходит, когда вы вызываете метод, может отличаться... Вы используете здесь исключительно EJB, в вашем коде нет ни капельки CDI!@EJB
является аннотацией EJB для внедрения зависимостей и @Stateless
является аннотацией EJB для области видимости
Если бы вы использовали CDI и использовали Weld в качестве его реализации (все EE-серверы, кроме tomee), то вы получите ленивый экземпляр для любого обычного bean-объекта bean-объекта. Это будет означать, что вы фактически внедрите "пустой" прокси-объект, и он будет создан только при первом доступе.
Теперь, что я имею в виду под инъекцией CDI - используйте @Inject
вместо @EJB
, Вы все еще можете иметь свой боб @Stateless
CDI, если он работает в вашем приложении, то оборачивает его своей областью действия. Я также сказал, что вам нужны нормальные bean-компоненты с бобами - это означает, что bean-компоненты используют прокси. Это почти все области применения CDI, кроме @Dependent
, Поэтому это @RequestScoped
, @SessionScoped
, @ApplicationScoped
, Зависимости вашего bean-компонента должны иметь эти возможности для достижения ленивого init.