wake-up-neo.com

wie bekomme ich mehrere Instanzen derselben Bohne im Frühjahr?

Standardmäßig sind Spring Beans Singletons. Ich frage mich, ob es eine Möglichkeit gibt, mehrere Instanzen derselben Bean für die Verarbeitung zu erhalten.

Folgendes mache ich derzeit

    @Configuration
    public class ApplicationMain { 

     @Value("${service.num: not configured}")
    private int num;

    //more code

@PostConstruct
public void run(){

        for (int i = 0; i < num ; i++) {
                    MyService ser = new MyService(i);
                    Future<?> tasks = executor.submit(ser);
                }

    }
}

Hier ist die Serviceklasse

    public class MyService implements Runnable {

    private String name;

    public Myservice(int i){

    name=String.ValueOf(i);

    }
  }

Ich habe meinen Usecase hier vereinfacht. Ich möchte MyService als Spring Bean haben und so viele wie möglich basierend auf der Konfiguration (die num ist) in der obigen for-Schleife erhalten. Ich frage mich, wie das möglich ist.

Vielen Dank

4
brain storm

Zuerst müssen Sie MyService zu einer Spring Bean machen. Sie können dies tun, indem Sie die Klasse mit @Component kommentieren. Wie Sie bereits sagten, handelt es sich bei Spring Beans standardmäßig um Singletons. Dies kann also mit einer weiteren Annotation geändert werden - @Scope("prototype").

Ein Prototyp des Bean-Bereichs bedeutet, dass jedes Mal, wenn Sie Spring nach einer Instanz der Bean fragen, eine neue Instanz erstellt wird. Dies gilt für Autowiring, die Abfrage des Anwendungskontexts nach der Bean mit getBean() oder die Verwendung einer Bean Factory.

15
Luke

Hier ist ein einfaches Beispiel, wie eine gewünschte Anzahl von Beans des gleichen Typs registriert wird

@Configuration
public class MultiBeanConfig implements ApplicationContextAware {

    @Value("${bean.quantity}")
    private int quantity;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        for (int i = 0; i < quantity; i++) {
            ((ConfigurableApplicationContext)applicationContext).getBeanFactory()
                    .registerSingleton("my-service-" + i, new MyService());
        }
        assert(applicationContext.getBeansOfType(MyService.class).size() == quantity);
    }

    class MyService {

    }
}
0
bart.s