これを試して:
<bean id="objImpl" class="com.work.Obj" autowire="constructor">
<constructor-arg index="0" ref="interfaceImpl"/>
</bean>
com.work.Obj
ここでは、コンストラクターの自動配線を使用してタイプの Bean を作成するように指定しました。コンストラクタ引数を指定すると、autowired arg がオーバーライドされます。したがって、インデックス 0 が明示的に提供されます。明示的に提供されていないその他の引数は、タイプによって自動配線されます。
注意byType
: コンストラクターの自動配線には、コンストラクターの引数に一致する複数の Bean が見つかった場合、Spring がどの Bean を自動配線するかを推測しようとしないのと同じ制限があります。さらに、クラスに複数のコンストラクターがあり、そのいずれかがオートワイヤーによって満たされる場合、Spring はどのコンストラクターを使用するかを推測しようとしません。この場合、例外が発生します。
編集:Interface
これを機能させるには、自動配線する必要があるものを除く、タイプ (コンストラクター引数タイプ)の他の Bean を次のようにマークする必要があります。autowire-candidate=false
例:
<bean id="impl1" class="stackoverflow.SomeImpl" autowire-candidate="false"/>
<bean id="impl2" class="stackoverflow.SomeImpl"/>
<bean id="obj" class="stackoverflow.Obj" autowire="constructor">
<constructor-arg index="0" ref="impl1"/>
</bean>
そして Obj クラス:
package stackoverflow;
public class Obj {
public Obj(SomeInterface i1, SomeInterface i2){
System.out.println("i1" + i1);
System.out.println("i2" + i2);
}
}
ここSomeImpl implements SomeInterface
に。実行impl2
中の Bean は、2 番目のコンストラクター arg で自動配線されi2
ます。最初の引数は、Spring 構成で手動で提供されます。