6

親と子の 2 つの Bean があります。Protoype スコープとして宣言した子 Bean。
親クラスの子のメソッドを呼び出すために、新しい子オブジェクトを使用したい。たとえば。以下の例では、ステートメント 1 が別の子オブジェクトでメソッドsayHiを呼び出し、ステートメント 2 が別の子オブジェクトでsayHi1を呼び出します。

1 つの方法は、 ApplicationContextAwareを実装しcontext.getBean("")、子のメソッドを呼び出す前に使用して新しい子オブジェクトを取得することです。しかし、私はそれをしたくありません。

他の代替手段はありますか?

@Component
public class Parent{

    @Autowired
    Child child;

    public void sayHello(){     
        child.sayHi();           -------------- (1)
    }

    public void sayHello1(){    
        child.sayHi1();          --------------- (2)
    }
}

@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE)
public class Child{

    public void sayHi(){
        System.out.println("Hi Spring 3.0");

    }

    public void sayHi1(){
        System.out.println("Hi1 Spring 3.0 ");      
    }

}
4

5 に答える 5

14

修正は、プロトタイプ Bean をスコープ付きプロキシとしてマークするだけです。これが意味することは、より小さなスコープの Bean をより大きなスコープに注入すると (プロトタイプがシングルトンに注入される場合のように)、次にプロキシになることです。 Bean のメソッドがより大きなスコープに注入され、Bean のメソッドがプロキシ経由で呼び出されると、プロキシはスコープを理解し、適切に応答します。

@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Child{

ここに参照があります

別のオプションは、ここで説明されているルックアップメソッドインジェクションと呼ばれるものを使用することです

于 2012-12-10T15:52:04.847 に答える
2

new Child毎回自分で作成するか、実際に春のコンテキストを使用して新鮮な豆を取得する必要があると思います。

Spring は、何かを注入する必要がある場合 (プロトタイプの場合) にのみ、新しいインスタンスを作成します。クラスにいるときは、実質的に春の範囲外です。

これは同様の投稿です: @Scope("prototype") bean scope not creating new bean

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototypeパート 4.4.2 および 4.4.3 が該当します。

于 2012-12-10T14:22:44.120 に答える
1

プロトタイプ スコープとは、Child(インジェクションまたはアプリ コンテキストからの明示的な Bean の取得を介して) オブジェクトを要求するたびに、Spring が新しいオブジェクトを提供することを意味します。あなたのParentクラスでは、あなたはChild1 回しか要求しなかったので、1 つしか取得できませんでした。で2 つの異なるChildオブジェクトが必要な場合はParent、2 つを自動配線します。

@Component
public class Parent{

    @Autowired
    Child child;

    @Autowired
    Child child1;

    public void sayHello(){     
        child.sayHi();
    }

    public void sayHello1(){    
        child1.sayHi1();
    }
}
于 2012-12-10T16:03:39.860 に答える
0

あなたはそれをすることはできません。ApplicationContext が起動した後、1 つの Bean のみが子に注入されます。親ごとに新しい子が作成されます。

親には子が1つしかないため、2つのメソッドはその子メソッドのみを呼び出します。

正確に何を達成しようとしていますか?それには適切な解決策があると確信しています。

于 2012-12-10T14:40:42.203 に答える