Подтвердить что ты не робот

Java EE 6: @Inject и экземпляр <T>

У меня есть вопрос о аннотации @Inject в java ee 6:

В чем разница между:

@Inject
private TestBean test;

@Inject
private Instance<TestBean> test2;

Чтобы получить ссылку:

test2.get();

Некоторые сведения об экземпляре: http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

Может быть, он не создает объект, пока он не вызван get()? Я просто хотел узнать, какой из них лучше для памяти jvm. Я думаю, direct @Inject будет напрямую создавать экземпляр объекта, даже если он не используется приложением...

Спасибо!

4b9b3361

Ответ 1

Дополнительную информацию о вариантах использования экземпляра можно найти в документации:

В определенных ситуациях инъекция - не самый удобный способ получить контекстуальную ссылку. Например, он не может использоваться, если:

  • Тип или классификаторы bean динамически изменяются во время выполнения
  • не может быть bean, который удовлетворяет типу и квалификаторам
  • мы хотели бы перебрать все beans определенного типа

Это довольно круто, поэтому вы можете сделать что-то вроде

@Inject @MyQualifier Instance<MyType> allMycandidates;

Таким образом, вы можете получить Итератор из allMyCandidates и перебрать все квалифицированные объекты.

Ответ 2

Вторая - это то, что называется отложенной инъекцией или инициализацией. Ваш контейнер будет выбирать работу по поиску, инициализации и вводу правильного объекта для TestBean, пока вы не вызовете get() в большинстве случаев.

Что касается "какой из них лучше", вы должны отнестись к правилам оптимизации. Не оптимизируйте, пока у вас не возникнет проблема, и используйте профилировщик.

Другими словами, используйте первый, если вы не можете окончательно доказать, что второй из них сохранит вам значительные объемы памяти и процессора.

Сообщите мне, если это ответит на ваш вопрос!