2017-08-03 21 views
4

スプリングすぐBeanタイプ/ビーン-singleton
等スコープ(アプリケーション・コンテキストごとに1つだけのBean)
-prototypeビーン(要求ごと新しいBean)春 - プロトタイプビーンシングルトン豆内部が場合

を有しますシングルトンBean内のプロトタイプBeanへの参照であり、シングルトンBeanへのリクエストごとに新しいプロトタイプBean(シングルトンBeanの内部にある)を取得する方法があります。
「はい」の場合、設定はどのようになりますか?

+0

は、なぜあなたはこれを必要でしょうか? –

答えて

2

シングルトンBeanにApplicationContextを注入し、getBeanメソッドを使用してプロトタイプを取得します。

@Autowired 
private ApplicationContext ctx; 

public void request() { 
    MyProptotypeBean mpb = this.ctx.getBean(MyProptotypeBean.class);//new instance for evety call to the method 
} 
3

このようなルックアップ方法と方法があります:

import org.springframework.beans.factory.annotation.Lookup; 
import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 

public final class Main { 

    public static void main(String[] args) { 
     ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class); 
     for (int i = 0; i < 10; i++) { 
      System.out.println(i + ".- call: " + applicationContext.getBean(Singleton.class)); 
     } 
    } 

    @ComponentScan("foo") 
    @Configuration 
    public static class Config { 

    // It's important to define SingletonBase component with @Component annotation and not here, If you define SingletonBase initialization here, It'll not work! 

     @Bean 
     @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
     public Prototype prototype() { 
      return new PrototypeBase(); 
     } 
    } 

    public interface Prototype { 

     public long getInstanceId(); 
    } 

    public interface Singleton { 

     public Prototype getPrototype(); 
    } 

    // It's important define SingletonBase component as this, If you define SingletonBase initialization inside a factory it'll not work! 
    @Component 
    public static class SingletonBase implements Singleton { 

     private static long instanceIdGenerator = 1L; 
     private long instanceId = generateId(); 

     private static synchronized long generateId() { 
      return instanceIdGenerator++; 
     } 

     public SingletonBase() { 
      System.out.println("Singleton initialized!"); 
     } 

     @Override 
     public String toString() { 
      return "SingletonBase{" + "instanceId=" + instanceId + ", prototypeId=" + getPrototype().getInstanceId() + '}'; 
     } 

     @Override 
     @Lookup 
     public Prototype getPrototype() { 
      return null; 
     } 
    } 

    public static class PrototypeBase implements Prototype { 

     private static long instanceIdGenerator = 1L; 
     private long instanceId = generateId(); 

     private static synchronized long generateId() { 
      return instanceIdGenerator++; 
     } 

     public PrototypeBase() { 
      System.out.println("Prototype initialized!"); 
     } 

     public long getInstanceId() { 
      return instanceId; 
     } 
    } 
} 

それは出力します。

Singleton initialized! 
Prototype initialized! 
0.- call: SingletonBase{instanceId=1, prototypeId=1} 
Prototype initialized! 
1.- call: SingletonBase{instanceId=1, prototypeId=2} 
Prototype initialized! 
2.- call: SingletonBase{instanceId=1, prototypeId=3} 
Prototype initialized! 
3.- call: SingletonBase{instanceId=1, prototypeId=4} 
Prototype initialized! 
4.- call: SingletonBase{instanceId=1, prototypeId=5} 
Prototype initialized! 
5.- call: SingletonBase{instanceId=1, prototypeId=6} 
Prototype initialized! 
6.- call: SingletonBase{instanceId=1, prototypeId=7} 
Prototype initialized! 
7.- call: SingletonBase{instanceId=1, prototypeId=8} 
Prototype initialized! 
8.- call: SingletonBase{instanceId=1, prototypeId=9} 
Prototype initialized! 
9.- call: SingletonBase{instanceId=1, prototypeId=10} 
+0

ニース、それは私の答えよりも優れています。 –