protoypeスコープのクラスの同じインスタンスを2つの場所で自動配線することは可能ですか

autowired inversion-of-control spring
protoypeスコープのクラスの同じインスタンスを2つの場所で自動配線することは可能ですか
  • 状況をよりよく表現するために例を変更しました

私は春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」と「fooB」にバインドし、別のインスタンスを「fooC」にバインドする方法があるかどうかを理解しようとしています

「FOO」の範囲が「シングルトン」になる場合、それが機能することを理解しています

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

また、これは自動配線の概念の正しい使い方ですか? 春のフレームワークの目的を悪用しようとしていますか

  4  0


ベストアンサー

「シングルトン」スコープも「プロトタイプ」スコープもあなたに合っていないように見えるので(単一のオブジェクトは必要ないが、毎回新しいインスタンスは必要ない)、別のスコープが必要です。

Webアプリケーションのコンテキストでは、すぐに使用できるソリューションがあります-`request`スコープを使用します-したがって、リクエスト/レスポンスサイクルごとに、Beanのインスタンスが1つだけになります。

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

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

  • 2つの FactoryBean`を定義します(実際には-のサブクラス
    `AbstractFactoryBean
    )-毎回新しいオブジェクトを返すものと同じオブジェクトを返すもの

  • @Resource(name =" prototypeFactoryBean ")`で `Foo`sを注入し、
    `@Resource(name =" singletonFactoryBean ")
    ( `@ Autowired`の代わりに)

  • 「singletonFactoryBean」は、シングルトンを返すように設計できます
    (ファクトリーBeanクラスに注入)

  • prototypeFactoryBean`は新しいインスタンスを作成し、キャストできます
    `BeanFactory
    (` getBeanFactory() で利用可能)を AutowireCapableBeanFactory`に渡し、 .autowire(newlyCreatedBean)`を呼び出して、それを返します。 (あるいは、 `ApplicationContext`を注入して、その AutowireCapableBeanFactory`を取得できます)

しかし、これは非常に複雑であり、私の説明の後でも、春の知識を広げる必要があります:)

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

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

5


「プロトタイプ」スコープの全体的なポイントは、毎回異なるインスタンスを取得することです。

また、プロトタイプスコープのBeanを自動配線することは、設計上、疑問の余地があります(実際、許可されていたとしても、少し驚きます)。 通常の考え方は、同じスコープのBeanを一緒に自動配線することです(これを回避する方法はありますが、ここでは関係ありません)。

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

1


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

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

1


タイトルとURLをコピーしました