2

2 つの引数を持つコンストラクターでは、一方を明示的に配線し、他方を自動配線したいと考えています。

何かのようなもの:

public Obj(Interface arg, Interface arg2) {
    // stuff
}

そして、Bean 定義では:

<bean id="objImpl" class="com.work.Obj">
    <constructor-arg index="0" ref="interfaceImpl"/>
    <constructor-arg index="1" autowire-this-somehow/>
</bean>

誰も方法を知っていますか?

4

1 に答える 1

4

これを試して:

<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 構成で手動で提供されます。

于 2014-07-24T11:31:55.743 に答える