Java EE 6: @Inject и Instance <T> - PullRequest
       58

Java EE 6: @Inject и Instance <T>

12 голосов
/ 10 февраля 2012

У меня вопрос по поводу аннотации @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 непосредственно создаст экземпляр объекта, даже если он не используется приложением ...

Спасибо!

Ответы [ 2 ]

10 голосов
/ 29 января 2013

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

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

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

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

@Inject @MyQualifier Instance<MyType> allMycandidates;

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

6 голосов
/ 15 февраля 2012

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

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

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

Дайте мне знать, если это ответит на ваш вопрос!

...