10

私は豆を持っています:

    <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:

public class EfcoBasketLogic extends BasketLogicImpl {

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

セッターを提供しない限り、erpService はnullです。しかし、なぜ?自動配線が行われている場所ではセッターは必要ないと思いましたか? BasketLogicImpl がそれを担当している可能性がありますか?

4

3 に答える 3

11

<context:component-scan />または のいずれかを介してスプリングに通知しない限り、注釈は検出されないため、セッターを使用する必要があります<context:annotation-config />。を指定したため、セッターが検出されましたautowire="byType"

この質問と回答も役立つ場合があります。Spring で自動配線を使用する場合

于 2012-11-02T10:49:38.910 に答える
1

まず、<context:component-scan />orを使用すると<context:annotation-config />、Spring がコードをスキャンして適格な Bean を見つけて依存関係を満たすことができます。これにより、それらを正しく接続する能力が大幅に向上するため、コンテキスト ファイルに追加することをお勧めします。

次に、@Inject は標準 (つまり JSR-330 仕様) のアノテーションであることに注意してください。Spring アノテーションを標準のアノテーションと組み合わせて使用​​しても問題ありませんが、そうすると動作が異なる場合があります。@Named は一般に @Inject と組み合わせて、コンポーネントを依存関係に一致させます (両方とも JSR-330)。詳細については、このリファレンスを参照してください。使用上のコメントについては、表 4.6 を参照してください。

しかし、「コンポーネントスキャンを使用しないのにセッターが必要なのはなぜですか」という質問に直接答えるには、コンポーネントスキャンを使用していないためです。Spring に依存関係「byType」を注入するように要求していますが、Spring がそのタイプのコンポーネントのコードをスキャンすることを許可していません。セッターが機能する理由は、注入されるセッター引数の型が、Spring によってコンパイルされたバイトコード (つまり、メタデータ) で検出され、リクエストが正常に解決されるためです。

于 2013-09-03T19:01:36.010 に答える
0

私の理解では、XML 構成はアノテーション構成をオーバーライドします。autowire="byType" が指定されているという事実は、依存関係を注入するためのセッター メソッドの存在を探す自動注入をオーバーライドします。

于 2016-04-13T19:13:40.453 に答える