2012-11-02 24 views
10

私は豆がありますautowired/injectedフィールドのセッターが必要なのはなぜですか?

<bean id="BasketLogic" class="efco.logic.EfcoBasketLogic" autowire="byType"> 
     <property name="documentLogic" ref="DocumentLogic" /> 
     <property name="stateAccess" ref="StateAccess" /> 
     <property name="contextAccess" ref="ContextAccess" /> 
    </bean> 

    <bean id="EfcoErpService" autowire="byType" class="efco.erp.service.EfcoErpServiceImpl"> 
    <constructor-arg ref="ErpConnector"/> 
    </bean> 

documentLogicstateAccesscontextAccess

BasketLogicImplのフィールドであり、私は<context:component-scan />

EfcoBasketLogic.java必要はありません。

を 私はセッターを提供しない限り、3210
public class EfcoBasketLogic extends BasketLogicImpl { 

     @Inject 
     private EfcoErpService erpService; 
    ... 
    ... 
    ... 
} 

erpServiceは、ヌルです。しかし、なぜ?オートワイヤリングが行われているところではセッターが必要ないと思ったのですか? BasketLogicImplがその責任を負うことはできますか?

答えて

11

スプリングは<context:component-scan />または<context:annotation-config />のいずれかを指定しないとアノテーションが検出されないため、セッターを使用する必要があります。 autowire="byType"を指定したため、セッターが検出されました。

あなたはこの質問を見つけ、有用にも答えることが

:すべてのWhen to use autowiring in Spring

+0

私がそうした場合、新たな問題が表示されます - > [XYZ]が定義されているタイプの_Noユニークな豆:予想される単一のマッチングBeanをしかし5_を見つけました。これは、 'を介してプロパティを明示的に挿入する他のBeanによって引き起こされ、そのインタフェースを実装するBeanが5つあります。プロパティ 'x'には注釈@Injectがあります。だから明示的な定義は、autowiredものをオーバーライドしないようだ?ただ1つの所与のタイプのBeanまたはプライマリとしてマークされたものがある場合Inject' @ – GarfieldKlon

+0

'が適切に解決されます。そのタイプの複数の互換性のあるBeanがある場合は、 '@ Resource'またはxmlを使用して名前で注入する必要があります。 – mrembisz

+0

私が明示的にそのbeanを ''経由で挿入しても? – GarfieldKlon

1

まず、<context:component-scan />または<context:annotation-config />の使用が対象と豆が大幅に改善されます依存関係を満たすためにのためにあなたのコードをスキャンするために春を可能にしますが能力ですそれらを正しく配線してください。あなたのコンテキストファイルにそれらを追加することをお勧めします。

第二に、あなたは@Injectアノテーション(JSR-330の仕様を意味する)の標準であることを認識する必要があります。 Springの注釈を標準のものと混在させても問題ありませんが、その際に動作が異なる場合があります。 @Namedは@Injectと組み合わされ、依存関係のあるコンポーネント(JSR-330)と一致します。詳細はreferenceを参照し、使用コメントについては表4.6を参照してください。

しかし、コンポーネントスキャンを使用していないため、質問に直接答えるには、「コンポーネントスキャンを使用しないときにセッターが必要なのはなぜですか?」です。あなたは、Springに依存性 "byType"を注入するように要求していますが、Springがそのタイプのコンポーネントのコードをスキャンすることを許可していません。セッターが働く理由は、注入されるセッターの引数の型がコンパイルされたバイトコード(すなわちメタデータ)に春によって発見することができるということである、そしてそれは成功したあなたの要求を解決します。

+0

FYI: ''を使うときは、beanクラスが宣言されているクラス階層のルート(@Namedまたは@Autowiredを介して)でbase-package属性を設定してください。例: pmhargis

0

私の理解では、XML構成がautowire =「byTypeは」オーバーライドに依存性を注入するためのセッターメソッドの存在を探し、自動注入を、指定した注釈config.The事実を上書きします。

関連する問題