4

**状況をよりよく表現するために例を変更しました

私はSpring 2.5を使用しており、次のような状況にあります

@Component
@Scope("prototype") 
Class Foo
{
}

class A
{ 
  @Autowired 
  Foo fooA;
}


class B
{ 
  @Autowired 
  Foo fooB;
}



class C
{ 
  @Autowired 
  Foo fooC;
}

@Autowiredの同じインスタンスを使用してバインドしFOO、 別のインスタンスをバインドしながらfooA使用する方法があるかどうかを理解しようとしていますfooBfooC

FOOwillの範囲があればうまくいくことを理解していsingletonます

protoypeしかし、スコープを使用しながら同じ目標を達成する方法があるかどうか、私はさまよっています。

また、これが自動配線の概念の正しい使用法であることを説明してください。春のフレームワークの目的を悪用しようとしていますか

4

3 に答える 3

5

どちらのスコープもあなたに合わないように見えるのでsingleton(prototype単一のオブジェクトは必要ありませんが、毎回新しいインスタンスは必要ありません)、別のスコープが必要です。

Web アプリケーションのコンテキストには、requestスコープを使用するというすぐに使える解決策があります。したがって、どこに何回注入しても、すべての要求/応答サイクルで Bean のインスタンスは 1 つだけになります。

非 Web アプリケーションのコンテキストでは、独自の実装を定義できます。org.springframework.beans.factory.config.Scope

更新:あなたが明確にした後、これは非常に奇妙なケースのようです. 私の頭に浮かぶのは次のことです。

  • FactoryBean2 つの s (実際には - のサブクラス) を定義します。1 つはAbstractFactoryBean毎回新しいオブジェクトを返し、もう 1 つは同じオブジェクトを返します (両方ともsingletonスコープ内にある必要があります) 。
  • Foos を@Resource(name="prototypeFactoryBean")andで注入します@Resource(name="singletonFactoryBean")(の代わりに@Autowired)
  • シングルトンを返すようにsingletonFactoryBean設計できます(ファクトリBeanクラスに注入されます)
  • prototypeFactoryBean新しいインスタンスを作成し、BeanFactory(から利用可能getBeanFactory()) をにキャストしてAutowireCapableBeanFactoryを呼び出し.autowire(newlyCreatedBean)、それを返すことができます。(または、 を注入しApplicationContextてその を取得することもできますAutowireCapableBeanFactory)

しかし、これは非常に複雑であり、私の説明の後でも、拡張された春の知識が必要になります:)

さらに、上記の「癖」を作るのではなく、デザインを再考する必要があると思います

更新 2:コメントの後、命名の概念は注釈に転送されます - 上記で示したように、使用できます@Resource(name="someBean")

于 2010-02-03T13:45:40.117 に答える
1

スコープの要点は、prototype毎回異なるインスタンスを取得することです。

また、プロトタイプ スコープの Bean をオートワイヤリングすることは、設計上、疑問があります (実際、許可されていたとしても、少し驚かれることでしょう)。通常のアイデアは、同じスコープの Bean を一緒に自動配線することです (これを回避する方法はありますが、ここでは関係ありません)。

あなたのデザインはすべて、プロトタイプであってFooはならないことを示唆しています。なぜプロトタイプにしたのですか?

于 2010-02-03T13:33:30.303 に答える
1

プロトタイプ スコープ オブジェクトの自動配線は完全に可能ですが、毎回新しいインスタンスが作成されます。だからあなたの質問に答えるために:いいえ、あなたはそれをすることはできません.

コンポーネントのスキャンと自動配線の使用は、他の部分では問題ないようです。

于 2010-02-03T13:37:40.680 に答える