2016-11-25 29 views
0

私が持っているバーのように実装したクラスは、次のとおりです。次のようにSpringでapplicationContext.getBeanを回避するにはどうすればよいですか?

class Bar implements ApplicationContextAware { 

    ApplicationContext applicationContext; 

    void barFoo() { 
     final Foo foo = applicationContext.getBean(Foo.class); 
     foo.doSomeWork(); 
     foo.shutDownProperly(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.applicationContext = applicationContext; 
    } 
} 

そしてFOOは私の設定で定義されています。シングルトンのFooが適切に仕事をしません、ので

<bean id="foo" class="biz.tugay.Foo" scope="prototype"/> 

それは毎回正常にシャットダウンする必要があります..

私はgetBeanが "dependency injectio n "/"テスト可能な "原則。

しかし、どのように、私は "barFoo" 方法については "バー" に "プロトタイプはFoo" "を注入" しますか?

+0

は、文脈に依存しますが、あなたの代わりに –

+0

@NickVanderhoven fooがすでに試作品ですが、バー自体シングルトンが細かいシングルトンのプロトタイプBeanを使用する場合があります。..のObjectFactoryの –

答えて

1

あなたはorg.springframework.beans.factory.ObjectFactory使用することができます。

class Bar { 

@Autowired 
private ObjectFactory<Foo> fooObjectFactory; 

} 

を、あなたはではFooオブジェクトを取得することができますので、あなたがシングルトンでプロトタイプBeanを注入する必要がある

Foo foo = fooObjectFactory.getObject(); 
+0

すべての実装は、プライベート内部クラスであるように見えますAutowiredは動作していないようです。 –

3

シングルトンのメソッド呼び出しのたびに新しいバージョンのプロトタイプBeanを使用します。

ScopedProxyFactoryBeanを使用することもできますが、Spring Frameworkリファレンスマニュアルでは、参照メソッドの注入を助言しています。

あなたはBarクラスになるだろう:

class Bar implements ApplicationContextAware { 

    ApplicationContext applicationContext; 

    void barFoo() { 
     final Foo foo = createFoo(); 
     foo.doSomeWork(); 
     foo.shutDownProperly(); 
    } 

    protected abstract Foo createFoo(); // Implementation will be provided by Spring Framework 
} 

あなたは単にBean定義でメソッドを宣言する必要があります。

<bean id="foo" class="biz.tugay.Foo" scope="prototype"/> 
<bean id="bar" class="biz.tugay.Bar"> 
    <lookup-method name="createFoo" bean="command"/> 
</bean> 

参照(強調鉱山):

シングルトン豆プロトタイプBean依存関係あり
..
しかし、シングルトンスコープのBeanにプロトタイプスコープの Beanの新しいインスタンスを実行時に繰り返し取得させたいとします。 Springコンテナが シングルトンBeanをインスタンス化し、その依存関係を解決して注入するときに、その注入が一度しか行われないため、プロトタイプスコープのBeanを シングルトンBeanに依存することはできません。 実行時にプロトタイプ Beanの新しいインスタンスを複数回実行する必要がある場合は、「メソッドインジェクション」のセクションを参照してください。

ルックアップメソッドインジェクション

ルックアップメソッドインジェクションは、コンテナ内の別の名前のBeanの検索結果を返すために、コンテナ管理対象Bean、 のメソッドをオーバーライドするコンテナの能力であります。ルックアップには通常、 プロトタイプBean [...]が含まれます。 Spring Frameworkは、 のメソッド注入を、CGLIBライブラリからのバイトコード生成を使用して、メソッドをオーバーライドするサブクラス を動的に生成することによって実装します。

関連する問題