@Component アノテーションが付けられたアンマネージ Bean のオートワイヤリング
-
05-07-2019 - |
質問
@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/AutoWiring.htm
エラーは、XML構成ファイルで定義されたBeanのシーケンスが原因です。
XMLファイルと同様に、 bar
のBeanが最初に作成され、次に @Autowired
が baz を見つけることができないため、それらの依存Bean code>。
まず baz
のBeanを宣言し、次に bar
のBeanを宣言する必要があります。