@Component アノテーションが付けられたアンマネージ Bean のオートワイヤリング

StackOverflow https://stackoverflow.com/questions/1004278

質問

@AutoWired を使用して、@Component で構成された非マネージド Bean をマネージド Bean に注入したいと考えています。設定が正しいと確信していますが、何らかの理由で例外が発生し続けます。

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean

エラーから判断すると、Baz クラスが見つからないと思われますが、理由はわかりません。XML 設定の context:spring-configured 要素によってこれが可能になるはずだと理解しています。また、適切な jar ファイル (spring-weaving.jar および aspectjweaver.jar) も含めるようにしました。

これが私のセットアップの簡単な例です。

私のXML構成:

<beans ...>
    ...

    <context:annotation-config/>
    <context:spring-configured/>
    <context:component-scan base-package="foo"/>

    <bean id="bar" class="foo.Bar"/>
    ...
</beans>

マネージド Bean が 1 つあります。

package foo;

public class Bar {

    @Autowired
    private Baz baz;

    public void setBaz(Baz baz) {
        this.baz = baz;
    }

    ...
}

そして 1 つのアンマネージド Bean:

package foo;

@Component
public class Baz {
    ...
}

何か足りないものはありますか?

編集:ログにはインスタンス化された Bean がリストされていますが、foo.Baz はその中には含まれていません。@Component アノテーション付きクラスが認識されない理由はわかりません。

役に立ちましたか?

解決

Barはxmlで構成されているため、xmlでのみ構成できます。つまり、それらを混合することはできません。つまり、「@ Autowired」はBazの注釈は選択されません(注釈はどれも選択されません)。スプリングが他のアノテーションのいずれかをリッスンするのは、クラスレベルでスプリングアノテーションを追加した場合のみです。

必要なのは、xmlでタイプごとにBeanを自動配線するように設定し、そのタイプのセッターを追加することです。そうすれば、目的の動作を実現できます。

<bean id="bar" class="foo.Bar" autowire="byType"/>

もう1つ、@ Componentを使用してBeanに注釈を付けると、それはスプリング管理Beanです 。 xmlで作成されていないからといって、管理されていないわけではありません。アンマネージドBeanは、春からは得られないものです。

BarとBazは両方とも春に管理されています。異なるのは、それらを定義するために選択したメカニズムです。

他のヒント

前の回答は、ある面では正しくありません。XML を使用して構成された Bean をオートワイヤリングできます。

セクション 3.4.5 より http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html:

XML ベースの構成メタデータ [2] を使用する場合、要素の autowire 属性を使用して Bean 定義の autowire モードを指定します。自動配線機能には 5 つのモードがあります。Bean ごとに自動配線を指定するため、自動配線するものを選択できます。

名前、タイプ、コンストラクターによって自動配線できます。これに関する大まかな例がここにあります。 http://www.java2s.com/Code/Java/Spring/Au​​toWiring.htm

エラーは、XML構成ファイルで定義されたBeanのシーケンスが原因です。

XMLファイルと同様に、 bar のBeanが最初に作成され、次に @Autowired baz

まず baz のBeanを宣言し、次に bar のBeanを宣言する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top