如何在春天获得同一个bean的多个实例?

时间:2017-02-21 21:08:39

标签: spring spring-boot spring-4 spring-bean

默认情况下,spring bean是单例。我想知道是否有办法获得同一个bean的多个实例进行处理。

这是我目前所做的事情

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

    }
}

这是服务类

    public class MyService implements Runnable {

    private String name;

    public Myservice(int i){

    name=String.ValueOf(i);

    }
  }

我在这里简化了我的用法。 我希望将MyService作为spring bean,并根据上述for循环中的configuartion(num)获取尽可能多的内容?想知道这是怎么可能的。

由于

2 个答案:

答案 0 :(得分:17)

首先,你必须让MyService成为一个Spring bean。您可以通过使用@Component注释类来完成此操作。接下来,正如您所说,Spring bean默认为单例,因此可以使用另外一个注释更改 - @Scope("prototype")

原型bean范围意味着每次向Spring询问bean的实例时,都会创建一个新实例。这适用于自动装配,使用getBean()询问bean的应用程序上下文,或使用bean工厂。

答案 1 :(得分:2)

以下是如何注册所需数量的相同类型的bean的简单示例

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

    }
}