2009-06-16 3 views
7

@AutoWiredを使用して、マネージドBeanに@Componentでコンフィグレーションされた非管理Beanを注入したいとします。私は、設定権を持っているかなり確信しているが、私は例外を取得しておく何らかの理由:@Componentで注釈が付けられたアンマネージドBeanの自動呼び出し

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

誤差に基づいて、私はそれがバズクラスを見つけることができません推測しているが、私はよ理由は分かりません。 XML設定のspring-configured要素が私にこれを可能にすると考えられていたという私の理解です。また、適切なjarファイル(spring-weaving.jarおよびaspectjweaver.jar)も含めてください。

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

私のXML設定ファイル:

package foo; 

public class Bar { 

    @Autowired 
    private Baz baz; 

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

    ... 
} 

そして、もう一つの管理対象外の豆:

<beans ...> 
    ... 

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

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

私は1つの管理Beanを持つ

package foo; 

@Component 
public class Baz { 
    ... 
} 

は、私が欠けているものはありますか?

EDIT:ログにはBeanのインスタンス化がリストされ、foo.Bazはそれらのいずれでもありません。なぜ@Componentアノテートされたクラスを取得していないのか分かりません。

+0

ログには何が表示されますか? fooパッケージ内のBeanを自動的に検出していることに言及していますか?デバッグロギングでは、どの@Component Beanが検出されたかを示す必要があります。 – skaffman

+0

ちなみに、aspectj/weaving/spring-configured stuffは、あなたがしたいことには必要ありません。これはちょうど基本的なautowiringです。 – skaffman

答えて

11

バーはxmlで設定されているため、xmlでのみ設定できます。つまり、それらを混在させることはできません。そのため、Bazの@Autowiredアノテーションは取得されません(アノテーションはありません)。クラスレベルで春のアノテーションを追加すると、春に他のアノテーションのいずれかを聴くことができます。

xmlの中で行う必要があるのは、型によってオートワイヤ化されるようにBeanを構成し、その型のセッターを追加すれば、望ましい動作を実現します。あなたは@Componentと豆に注釈を付けるとき

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

もう一つは、それは春がBeanを管理です。 xmlで作成されていないからといって、それが管理されていないというわけではありません。管理されていないBeanは、あなたが春から得ないものです。

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

+0

私の専門用語に関する完全な誤解。素晴らしい答え。ありがとう! –

+3

xmlと注釈の設定を混在させることができます。 – banterCZ

+0

@banterCZはい...私は今気付いています –

6

以前の応答は、1つの側面では正しくありません。さもなければ、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モードを指定します。 autowiring機能には5つのモードがあります。 Beanごとに自動配線を指定して、オートワイヤリングするものを選択できます。

名前、型、およびコンストラクタでオートワイヤできます。 http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

-2

このエラーは、XML設定ファイルで定義されているBeanのシーケンスによるものです。

XMLファイルの場合、barのBeanが最初に作成され、次に依存するBeanが作成され、@Autowiredbazが見つかりません。

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

+0

xml設定では、すべてのBeanはどこでも宣言できますが、その順序は関係ありません。 –

関連する問題