7

@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はその1つではありません。@Component注釈付きクラスを取得しない理由がわかりません。

4

3 に答える 3

11

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

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

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

もう1つ、@ComponentでBeanにアノテーションを付けると、それSpring Managed Beanです。xml で作成されていないからといって、管理されていないわけではありません。アンマネージド Bean は、Spring から取得できないものです。

Bar と Baz はどちらもスプリング管理されています。異なるのは、それらを定義するために選択したメカニズムです。

于 2009-06-17T16:35:06.923 に答える
6

ある面では、前の応答は正しくありません。xmlで構成されているBeanを自動配線できます。

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

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

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

于 2010-10-25T14:41:39.683 に答える
-2

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

XML ファイルと同様に、bean forbarが最初に作成され、次に依存する bean@Autowiredが見つからないため、作成されますbaz

baz最初に Bean を宣言し、次に for を宣言する必要がありbarます。

于 2012-05-21T13:53:23.357 に答える