1

先日、コードベースで次の非正統的な構成を見つけて、不思議に思いました。インターフェイス名を Bean の名前としても使用する場合、予想される Spring Context の動作は何ですか? コントローラーで @Autowiring を使用していた場合、違いはありますか? 次のスニペットは、この設定を示しています。

interface MyAppService {...}

class InfrastructureService implements MyAppService {...}

class AdministrationService implements MyAppService {...}

class InfrastructureController {
   // some code
   public void setMyAppService(MyAppService svc){...}
}

<bean id="myAppService" class="InfrastructureService"/>

<bean id="administrationService" class="AdministrationService"/>

<bean id="infrastructureController" class="InfrastructureController">
   <property name="myAppService" ref="myAppService"/>
</bean>

または、コントローラーのみが次のように定義されている場合、予想される動作はどうなるでしょうか。

class InfrastructureController {
   @Autowired
   public void setMyAppService(MyAppService svc){...}
}
4

2 に答える 2

2

ここで問題になるのはなぜですか?idインターフェイス タイプではなく、xml でBean を参照します。

<property name="myAppService" ref="myAppService"/>

これは、指定myAppServiceされたプロパティに id がmyAppService注入された Bean が含まれることを意味します。インターフェイスについては何もありません。

編集: 注釈付きの自動配線を使用し、コンポーネントとして登録された同じインターフェイスのさまざまな実装がある場合は、使用する実装を指定するために使用qualifiersするSpring必要があります。実装が 1 つしか登録されていない場合は、何もする必要はありません。

于 2012-09-27T12:01:16.490 に答える
0

@AutoWired を単独で配置すると、タイプで依存関係が検索されます (あなたの場合は MyAppService です)。依存関係の検索を絞り込みたい場合は、以下のように @Qualifier を使用できます。

class InfrastructureController {
@Autowired
@Qualifier("NAME_OF_BEAN")
public void setMyAppService(MyAppService svc){...}
}
于 2012-09-27T12:10:40.123 に答える