Java EE 6:@Inject和Instance <T>

jih*_*ter 14 dependency-injection ejb javabeans cdi java-ee-6

我对@Injectjava ee 6中的注释有疑问:

有什么区别:

@Inject
private TestBean test;

@Inject
private Instance<TestBean> test2;
Run Code Online (Sandbox Code Playgroud)

要参考:

test2.get();
Run Code Online (Sandbox Code Playgroud)

关于Instance的一些信息:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

也许在get()调用之前它不会创建对象?我只是想知道哪一个更适合jvm内存.我认为direct @Inject会直接创建一个对象的实例,即使它没有被appplication使用...

谢谢 !

Raf*_*ael 10

有关Instance用例的更多信息,请参阅文档:

在某些情况下,注入不是获取上下文引用的最方便的方法.例如,在以下情况下可能不会使用它:

  • bean类型或限定符在运行时动态变化
  • 可能没有满足类型和限定符的bean
  • 我们想迭代某种类型的所有bean

这很酷,所以你可以做类似的事情

@Inject @MyQualifier Instance<MyType> allMycandidates;
Run Code Online (Sandbox Code Playgroud)

因此,您可以从allMyCandidates获取迭代器并迭代所有限定对象.


Jon*_*her 7

第二种是所谓的延迟注入或初始化.您的容器将选择执行定位,初始化和注入TestBean的正确对象的工作,直到您在大多数情况下调用get().

至于"哪一个更好",你应该遵循优化规则.在遇到问题之前不要进行优化,并使用分析器.

换句话说,使用第一个,除非你可以明确地证明第二个节省了大量的内存和CPU.

如果能回答你的问题,请告诉我!