web-dev-qa-db-ja.com

スプリングオートワイヤーとプロトタイプスコープ

次の注釈が付いたBarという名前のクラスがあります:@Configurable(autowire = Autowire.BY_TYPE)

プライベートメンバーには、次の注釈があります。

@Autowired(required = true)
private Foo foo;

春の構成では、FooクラスのBeanがあります。 Beanがscope="prototype"で定義されている場合は機能せず、次の例外が発生します。

NoSuchBeanDefinitionException:依存関係に一致するタイプFooのBeanが見つかりません:この依存関係のautowire候補として適格なBeanが少なくとも1つ必要です

注入されたBeanスコープを"singleton"に変更すると、正常に機能します。

プロトタイプスコープBeanの自動配線は許可されていませんか?

(Beanを手動で取得する以外に)回避策はありますか?

事前に感謝します、Avner

14
Avner Levy

次のリンクは、そのようなシナリオの代替ソリューションを提供します。

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-in​​stances-from-code/

最初のリンクでは、Fooへの追加について説明しています。

@Component
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
class Foo

これにより、呼び出しごとに新しいインスタンスが発生します。

13
Avner Levy

そのBeanのxmlで宣言されているプロトタイプ/シングルトンの問題が問題だと思います。

プロトタイプスコープBeanの自動配線は許可されていませんか?

許されないと思います。ロジックは、許可されている場合、そのクラスを使用するときはいつでも、そのBeanを常にフィールドとして再インスタンス化する必要があります。これは、このBeanがフィールドとして自動配線されるクラスがシングルトン自体である場合は特に、奇妙です。

(Beanを手動で取得する以外に)回避策はありますか?

スコープ属性を削除してみてください。プロトタイプ属性の場合、取得されません。それらのBean(サービスとDAO)がapplicationContextで宣言されている場合、デフォルトではBeanはシングルトンであるはずなので、autowireアノテーションがシングルトンとしてそれを取得できるようにします。

0
vine