2017-01-16 16 views
0

私は依存性注入のためにSpring Frameworkを使用しています。ある時点で、あるクラスのインスタンスを別のクラスに注入し、同じクラスの追加の一時オブジェクトを作成する必要があります。私はおそらく、注入されたBeanの範囲をプロトタイプに変更することができましたが、これを行う簡単な方法があるのだろうかと思います。Springでクラスインスタンスを手動で作成する方法

私の唯一のアイデアは、newを使用して作成することですが、Springで適切な方法があるかどうかを知りたがっています。

ただ、一般的な例:

@Inject 
private ClassA classA; 

public void methodA() { 

// here I need another instance of ClassA to be used in the scope of this method 

} 
+0

この「一時的な」クラスの目的は何ですか?代わりにプロトタイプBeanが必要ですか? – chrylis

+0

@chrylis私は私の自動化されたテストフレームワークのためにSpringを使用していますので、おそらく古典的なSpringの使い方ではありません。私の場合、このオブジェクトは、私がテストしているアプリケーションのいくつかの論理要素を表しています。ここでは、このメソッド内でのみ関連する追加の要素をカプセル化する必要があります。希望は意味をなさない。 –

+0

プロトタイプスコープと 'ApplicationContext'が必要なものすべて –

答えて

-4

あなたがにClassAの別のインスタンスの目的に基づいてこれを行うことができます2つの方法があります。 最初に、 "new"キーワードを使用して新しいオブジェクトを作成できます。

public void methodA() 
{ 
ClassA antherClassAInstance = new ClassA(); 
} 

この方法は、このメソッドに対してのみ新しいインスタンスを使用する場合に適しています。

次に、 @Autowiredアノテーションを使用してグローバルインスタンスを宣言します。

@Autowired 
ClassA antherClassAInstance; 
+0

のようなBeanUtilsを使用することができます。@Autowiredは同じ機能を提供します。シングルトンを配線します。私はまた、 'new'を使うことは私の第二の選択肢だと言いましたが、選択肢があるかどうかを知りたがっています。 –

+0

新しいインスタンスの目的を教えていただけますか?必要に応じて、最初のインスタンスをクローンすることができます。 –

+0

元の質問に関する私のコメントを読んでください。 –

1

サブクラス化してprototypeスコープを使用してください。

@Autowired 
private ApplicationContext context; 

public void methodA(){ 
    // will return a new instance (still a bean) every time its called 
    ClassB bean = context.getBean(ClassB.class); 
    ... 
} 

あなたはまたClassAにダウンキャストすることができます、あなたが好きならBean名を使用します。

@Component 
@Scope("prototype") 
public class ClassB extends ClassA { 
} 

次に、それを使用します。

+0

あなたのご意見ありがとうございます。興味深いアプローチです。しかし、私が知っていることによると、 'getBean'を直接使うのは悪い習慣です。 –

+0

'getBean'は、より広いスコープBean(シングルトンなど)の中で厳密なスコープBean(リクエスト、プロトタイプなど)を取得するための完全に一般的なメソッドです。それを使用したくない場合、唯一のオプションは[スコープ付きBeanを依存として使用する](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans)です。 html#beans-factory-scope-other-injection)、これは実行不可能でエラーが起こりやすい(特にプロトタイプのスコープでは)aopプロキシを必要とします。注入された(autowired)フィールドを持つBeanを作成する際には、** 'new'キーワードを使用しないでください。 – bekce

+0

それほど素晴らしいアプローチはありません。これは、あなたのクラスをapplicationContext全体に依存させます。あなたが全体のコンテキストを模倣する必要があるので、設計が悪く、テストするのが難しい。この場合、Factory-beanを使うほうがはるかに優れています。 –

関連する問題