Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java EE 6 : @Inject and Instance<T>

Tags:

I have a question about the @Inject annotation in java ee 6 :

What is the difference between :

@Inject
private TestBean test;

@Inject
private Instance<TestBean> test2;

To have the reference :

test2.get();

Some infos about Instance : http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

Maybe it's doesnt create the object until it's called by get() ? I just wanted to know which one is better for the jvm memory. I think direct @Inject will directly create an instance of the object , even if it's not used by the appplication...

Thank you !

like image 865
jihedMaster Avatar asked Feb 10 '12 10:02

jihedMaster


2 Answers

The second is what's called deferred injection or initialization. Your container will elect do do the work of locating, initializing, and injecting the proper object for TestBean until you call get() in most circumstances.

As far as "which one is better", you should defer to the rules of optimization. Don't optimize until you have a problem, and use a profiler.

Another words, use the first one unless you can definitively prove the second one is saving you significant amounts of memory and cpu.

Let me know if that answers your question!

like image 157
Jonathan S. Fisher Avatar answered Sep 20 '22 13:09

Jonathan S. Fisher


Further information on use cases for Instance can be found in documentation:

In certain situations, injection is not the most convenient way to obtain a contextual reference. For example, it may not be used when:

  • the bean type or qualifiers vary dynamically at runtime
  • there may be no bean which satisfies the type and qualifiers
  • we would like to iterate over all beans of a certain type

This is pretty cool so you can do something like

@Inject @MyQualifier Instance<MyType> allMycandidates;

So you can obtain an Iterator from allMyCandidates and iterate over all the qualified objects.

like image 30
Rafael Avatar answered Sep 18 '22 13:09

Rafael