2011-12-29 25 views
4

SpringサービスクラスまたはJSF Beanがあるとします。私はこれらのクラスを別のクラスに結び付けます。今まで問題はありません。これらの注入されたフィールドはどのメソッドでも使用できます。コンストラクターの依存性注入

しかし、これらをコンストラクタで使用すると、NullPointerExceptionが発生します。

おそらく、コンストラクタは依存性注入が行われる前に実行され、注入されたフィールドは表示されません。コンストラクタに依存性注入を使用するソリューションはありますか?

答えて

3

明らかに、このオブジェクトが存在しない場合は、オブジェクトに何も挿入することはできません。そして、存在するためには、オブジェクトが構築されなければならない。

スプリングは、コンストラクタ注入をサポート:

@Autowired 
public SomeService(SomeDependency dep) { 
    ... 

スプリングはまた、すべての依存関係が注入された後の豆を初期化することを可能にする、@PostConstructをサポートします。

JSFについてよくわかりません。

+1

よく['@ PostConstruct'](http://docs.oracle.com/javase/6/docs) /api/javax/annotation/PostConstruct.html)はEJBアノテーションであるため、明らかにJavaEEでサポートされています。また、['@Ìnject'](http://docs.oracle.com/javaee/6/api/javax/inject/Inject.html)もコンストラクタに適用されます。 –

+0

@Sean:EJBアノテーションではありません。これはJava SE APIの一部です。しかし、実際にはEJBとの組み合わせで最も多く見られます。 – BalusC

+0

@BalusC正式にはそうかもしれませんが、ドキュメンテーションはEJB仕様を明示しています。 –

3

いいえいいえ注入されたフィールドをコンストラクタで参照することはできません。フレームワークは何らかの理由で(コンストラクタを呼び出す)オブジェクトを構築し、コンストラクタの実行中に空になるように依存関係を注入する必要があります。あなたは通常、代わりにあなたの方法の一つに@PostConstruct注釈を適用してやると、そこに初期化を実行します。

class MyBean { 
    @Inject 
    private MyDependency myDep; 

    @PostConstruct 
    public void init() { 
    assert myDep != null; 
    } 
} 

春のXML構成の場合には、あなたの<bean>定義でinit-method="init"代わりの@PostConstructを使用することができます。あるいは、コンストラクタインジェクションをxml:

<bean id="myBean" class="my.package.MyBean"> 
    <constructor-arg ref="myDependency/> 
</bean> 

または注釈と同等のものを使用することができます。

+0

ええ@postConstructを使用すると、代わりにコンストラクタを使用することができます –

+0

さらに、 '@ PostConstruct'は' private' initメソッドでも使用できます。プライベートな可視性にinitメソッドを設定すると、きれいで整理されたパブリックAPIを持つことができます。 (http://docs.oracle.com/javaee/6/api/javax/annotation/PostConstruct.htmlを参照) – Abdull