2016-11-15 5 views
3

私は、コンストラクタ注入し、依存関係で親クラスを持っている:私はこのクラスから継承する場合は、私はいつも親を呼び出すコンストラクタを再定義する必要があります春/ DI:子クラスのコンストラクタ・インジェクション

class ParentClass { 
    private final MyService service; 

    @Autowired 
    ParentClass(MyService service) { 
    this.service=service; 
    } 
    // ... 
} 

コンストラクタ?セッター・インジェクションを使用して

class ChildClass extends ParentClass { 
    // Do I really need this? 
    @Autowired 
    ChildClass(MyService service) { 
    super(service); 
    } 
    // ... 
} 

、私は子クラスがリンクされた機能には触れていない場合は私にはいいですねこれは、親クラスに依存性を保つことができるように、子供にそれを再配線する必要はありませんように見えます依存関係に:

class ParentClass { 
    private MyService service; 

    @Autowired 
    void setMyService(MyService service) { 
    this.service=service; 
    } 
    // ... 
} 

class ChildClass extends ParentClass { 
    // ... 
} 

私がオートワイヤリングコードを繰り返し、子供に依存関係を扱う避けたい場合は、私はこれだけ使っセッターやフィールド注入を行うことができますようです。

この依存性注入を行うクリーナパターンがありますか、コンストラクタ注入が推奨されているにもかかわらず、フィールド/セッタ注入を使用する必要がある場合ですか?

ありがとうございます!

+1

plain javaでは、デフォルト以外のコンストラクタ(引数なしコンストラクタ)を持つ親クラスがある場合でも、子クラスでは、デフォルト以外の親コンストラクタを呼び出すコンストラクタを再定義する必要があります。だから、Javaはコンストラクタに関するあなたの質問に関連しています、Spring/DIはそれと関係がありません。 – pleft

+0

ありがとうございます。私の質問はDI問題に関するものでした。わかりやすく編集しました。 –

+0

あなたが「このクラスから継承すれば、親コンストラクタを呼び出すコンストラクタをいつも再定義する必要がありますか?あなたの質問を編集する必要があるかもしれません。なぜなら、答えはイエスであり、あなたはそうしなければならず、DIとは何の関係もありません。 – borowis

答えて

1

これはSpringの問題ではなく、Javaです。子クラスのコンストラクタを削除して、あなた自身のために何が起こるかを見てください。あなたのコードはコンパイルされるべきではありません。前に説明したthisの回答を参照してください。

依存性注入に関する質問に答えると、@Autowiredは、親クラスのセッターで機能しますが、サブクラスでオーバーライドしない限り(試してみてください)。その理由は、Springがオブジェクトではなくクラスを扱うため、サブクラスがインスタンス化されるときに、アノテートが@Inherited@Autowiredではない)とマークされていない限り、Springは親クラスのオーバーライドされたメソッドでアノテーションをチェックしません。

したがって、サブクラスごとに@Autowiredを使用するか(実際は大きな問題ではない)、セッター注入に切り替えたり、サブクラスを委譲に置き換えたり、親クラスを抽象的にしてコンストラクタインジェクションサブクラスでのみ使用できます。

関連する問題