19

2 つの Bean を宣言し、Spring 依存性注入を使用してそれらをインスタンス化したいですか?

<bean id="sessionFactory" class="SessionFactoryImpl">
 <property name="entityInterceptor" ref="entityInterceptor"/>
</bean>

<bean id="entityInterceptor" class="EntityInterceptorImpl">
 <property name="sessionFactory" ref="sessionFactory"/>
</bean>

しかし、Spring は「現在作成中の FactoryBean が getObject から null を返しました」という例外をスローします。

ここで相互に依存する Bean の配線が機能しないのはなぜですか? どこでも遅延プロパティバインディングを指定する必要がありますか?

4

4 に答える 4

13

残念ながら、Spring でコンテナーの初期化が機能する方法では、Bean は完全に初期化された後にのみ別の Bean に注入できます。あなたの場合、相互に依存しているため、いずれかの Bean が初期化されないようにする循環依存関係があります。これを回避するには、Bean の 1 つに BeanFactoryAware を実装し、beanFactory.getBean("beanName") を使用して他の Bean への参照を取得します。

于 2009-01-08T17:10:22.027 に答える
3

ニーシュはそうです、Springはそのままではこれを行いません。

相互依存する Bean は、設計上の問題を示唆しています。これを行うための「クリーンな」方法は、もちろん、実装を制御できるという条件で、そのような奇妙な依存関係がないようにサービスを再設計することです。

于 2009-01-08T17:23:13.750 に答える
2

依存関係を設定するBeanPostProcessorを実装できます。

または...

ここでコスティンの返信を参照してください。

http://forum.springframework.org/showthread.php?t=19569&highlight=circular+dependencies

ここでアンドレアスの返信を参照してください。

http://forum.springframework.org/showthread.php?t=29572&highlight=circular+dependencies

于 2009-01-08T17:34:50.090 に答える
0

使用している ApplicactionContext を拡張し、メソッド createBeanFactory() をオーバーライドできます

 protected DefaultListableBeanFactory createBeanFactory(){
    DefaultListableBeanFactory beanFactory = super.createBeanFactory();
    // By default this is false;
    beanFactory.setAllowRawInjectionDespiteWrapping( true );
    return beanFactory;
 }

これは機能しますが、循環参照が可能になるため注意してください。

于 2009-01-08T20:30:35.587 に答える