2009-06-05 8 views
5

私たちは、次のレガシー2.0.7春のコードがあります。contextは、我々は無視AbstractApplicationContext.getBeansOfTypeについてQ()とgetBean()

org.springframework.context.support.AbstractApplicationContext 

ノートのインスタンスである

final Map<String, MyClass> secondaryFactories 
    = (Map<String, MyClass>) context.getBeansOfType(MyClass.class, 
                false, true); 

return (MyClass) context.getBean("myClass"); 

を戻り値はgetBeansOfType()です。これは正常に動作しますが、問題はgetBeansOfType()への呼び出しに時間がかかることです。ただし、この呼び出しの戻り値を無視しても、この呼び出しを取り除こうとすると、getBean()によって返されたMyClassのインスタンスは完全に初期化されません。 (だから、明らかに、getBeansOfType()への呼び出しは、私たちが必要とする副作用のいくつかの並べ替えを持っている。)

我々はgetBeansOfType()への呼び出しが過剰であると思われるとMyClassのインスタンスをして得られたように、我々はより軽量な何かを行うことができますgetBean()への呼び出しは完全に初期化されます(ただし、nullではなく例外もスローされません)。

これを行うにはより効率的な方法がありますか?

+0

BeanType.MY_CLASS.getName()とは何ですか? –

+0

あなたはどのバージョンのSpringを使用していますか?私のバグのように聞こえる。 –

答えて

1

まずはロギングをオンにし、何が起こっているのかを確認することをお勧めします。春は通常かなり役に立ちます。

さらに、context.getBeansOfTypecontext.getBeanの違いの1つは、getBeansOfTypeが親コンテキストを照会しないということです。あなたが持っているなら、あなたはここで相違を打つかもしれません。

3番目に、私は 'driver' beanが遅延初期化されていると仮定します。コンテキストが初期化されている間に、マルチスレッドコードを実行していますか?これに関連して、2.5サイクル後半に修正のreportsがありました。 getBeansOfTypeは、初期化されていないBeanを返すgetBeanの問題が隠されるように、遅延を生成するか、またはメモリバリアを叩くだけかもしれません。

第4に、議論のためだけに、Spring 2.5.6でアプリケーションを実行してみてください。それがうまくいくなら、有罪判決の当事者を知ることができます。

+0

+1はデバッグレベルのロギングを有効にするため、春はそのレベルで非常に冗長です – skaffman

関連する問題