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
будет напрямую создавать экземпляр объекта, даже если он не используется приложением...
Спасибо!
Ответы
Ответ 1
Дополнительную информацию о вариантах использования экземпляра можно найти в документации:
В определенных ситуациях инъекция - не самый удобный способ получить контекстуальную ссылку. Например, он не может использоваться, если:
- Тип или классификаторы bean динамически изменяются во время выполнения
- не может быть bean, который удовлетворяет типу и квалификаторам
- мы хотели бы перебрать все beans определенного типа
Это довольно круто, поэтому вы можете сделать что-то вроде
@Inject @MyQualifier Instance<MyType> allMycandidates;
Таким образом, вы можете получить Итератор из allMyCandidates и перебрать все квалифицированные объекты.
Ответ 2
Вторая - это то, что называется отложенной инъекцией или инициализацией. Ваш контейнер будет выбирать работу по поиску, инициализации и вводу правильного объекта для TestBean, пока вы не вызовете get() в большинстве случаев.
Что касается "какой из них лучше", вы должны отнестись к правилам оптимизации. Не оптимизируйте, пока у вас не возникнет проблема, и используйте профилировщик.
Другими словами, используйте первый, если вы не можете окончательно доказать, что второй из них сохранит вам значительные объемы памяти и процессора.
Сообщите мне, если это ответит на ваш вопрос!