2012-02-10 20 views
12

私は、Java EE 6で@Inject注釈について質問があります:のJava EE 6:@Injectとインスタンス<T>

の違いは何ですか:

@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メモリの方が良いかを知りたかったのです。私は直接@Injectは、アプリケーションの使用されていない場合でも、オブジェクトのインスタンスを直接作成すると思う...

ありがとう!

+1

私の答えは十分でしたか、あなたの質問を誤解していましたか?偶然、それが役に立つと思ったら、それを投票し、そして/またはそれを承認されたものとしてマークすることを忘れないでください。ありがとう!返信用 –

答えて

6

第2は、遅延噴射または初期化と呼ばれるものです。あなたのコンテナは、ほとんどの状況でget()を呼び出すまで、TestBeanの適切なオブジェクトを探し出し、初期化し、そして注入する作業を行います。

「どちらが優れているか」という限りでは、最適化のルールに従うべきです。問題が生じるまで最適化しないでください。プロファイラを使用してください。

別の言葉では、2番目に重要なメモリとCPUを節約していることを確かに証明できない限り、最初の単語を使用してください。

あなたの質問に答えるかどうか教えてください。インスタンスのユースケースに

+0

Thxをは、実際に私が(GWTに基づく)Vaadinフレームワークのためにこれを使用したいと注入のようなperformences殺すように私は、すべてのUIコンポーネントを置くかどうかを知りたいと思った: @Inject LoginScreenログイン画面 を実際には、アプリケーションの開始時に、彼はユーザーがそれらを使用していない場合、パフォーマンスが低下する可能性があるjvmのすべての注入を読み込みます... – jihedMaster

+1

私は正直なところ、直接噴射のパフォーマンスの影響を見ることに疑いがあります。私は確かにそのルートに行くと技術的な負債を危険にさらすことはありません!私は春に50豆以上の大規模なDI注入アプリケーションを書いており、DIからの影響はほとんどありませんでした。 –

+0

これは、ジー6で多くのInjectアノテーションを実行しても、クライアントのパフォーマンスが低下しないということですか? – jihedMaster

10

さらなる情報は、ドキュメントに見出すことができる:

特定の状況では、注入は文脈参照を取得するための最も便利な方法はありません。場合、例えば、それが使用されなくてもよい。

  • Beanタイプまたは修飾子が実行時に動的に変化
  • が、我々は上のすべての反復したい
  • 型と修飾子を満足ない豆であってもなくてもよいです特定の種類の豆

あなたは

@Inject @MyQualifier Instance<MyType> allMycandidates; 
ような何かを行うことができますので、これはかなりクールです

したがって、allMyCandidatesからIteratorを取得し、すべての修飾オブジェクトを反復処理できます。

関連する問題