2017-04-05 15 views
2

は、私の知る限りコンストラクタインジェクションは必須の依存関係とセッター注入を施行知っているように、オプションの依存関係を許可したが、その後...コンストラクタ依存性注入

は、このアプローチでは不可能であろう???与えられたタイプの豆が見つからない場合は、春nullを注入しませんよう

@Component 
public class Car { 

    @Autowired(required=false) 
    public Car(Engine engine, Transmission transmission) { 
     this.engine = engine; 
     this.transmission = transmission; 
    } 
} 
+1

CarがSpringによって管理されるようにするための最良のアイデアはありません。しかし、あなたは新しい車を作ることができます...しかし、CarServiceはSpringによって管理することができます – Reg

+2

同時に、異なる車の間でエンジンとトランスミッションを共有することはおそらく最良の考えではありません;) –

答えて

5

あなたのアプローチは機能しません。 setterメソッドに@Autowired(required=false)を設定した場合、このようなbeanがない場合、このsetterは呼び出されません。コンストラクタでは不可能です。オプションの依存関係を宣言するためのJava 8 Optionalを使用することができますSpringバージョン4.1+については

@Component 
public class Car { 

    @Autowired 
    public Car(Engine engine, Optional<Transmission> transmission) { 
     this.engine = engine; 
     this.transmission = transmission.orElse(null); 
    } 
} 

この場合、春にはEngineが必要であることを理解するだろうとしかしTransmissionはオプションです。したがって、タイプTransmissionのBeanが見つからない場合は、Optional.empty()が注入されます。