web-dev-qa-db-fra.com

comment obtenir plusieurs instances du même haricot au printemps?

Par défaut, les haricots de printemps sont des singletons. Je me demande s'il existe un moyen d'obtenir plusieurs instances du même bean pour le traitement.

Voici ce que je fais actuellement

    @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);
                }

    }
}

Voici la classe Service

    public class MyService implements Runnable {

    private String name;

    public Myservice(int i){

    name=String.ValueOf(i);

    }
  }

J'ai simplifié mon cas d'utilisation ici. Je veux avoir MyService comme bean de printemps et en obtenir autant que possible en fonction de la configuration (qui est num) dans la boucle for ci-dessus? se demandant comment cela est possible.

Merci

10
brain storm

Vous devez d'abord faire de MyService un bean Spring. Vous pouvez le faire en annotant la classe avec @Component. Ensuite, comme vous le dites, les beans Spring sont des singletons par défaut, donc cela peut être modifié avec une annotation de plus - @Scope("prototype").

Une portée de bean prototype signifie que chaque fois que vous demandez à Spring une instance du bean, une nouvelle instance sera créée. Cela s'applique à Autowiring, demandant le contexte d'application du bean avec getBean(), ou utilisant une fabrique de bean.

21
Luke

Voici un exemple simple de la façon d'enregistrer un nombre souhaité de beans du même type

@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 {

    }
}
2
bart.s