2017-02-21 53 views
3

默认情况下,spring bean是单身人士。我想知道是否有办法获得同一个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-loop中的配置文件(即num)获取尽可能多的内容?想知道这怎么可能。

感谢

+0

你可以用bean工厂它从你的应用程序上下文 –

+0

@ bart.s的豆所需数量的一个简单的例子:你可以举一个例子并展示如何做到这一点? –

+0

当然,看看下面的答案 –

回答

8

首先,你将不得不作出MyService一个Spring bean。你可以通过用@Component注解这个类来做到这一点。接下来,如您所说,默认情况下,Spring bean是单身人士,所以这可以通过一个注释来更改 - @Scope("prototype")

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

+1

bean上的一个新的配置,而不是'@Scope(“prototype)'是'@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)' – Patrick

+0

好吧,我如何为每个你可以说我怎么可以用它来做我的用例呢? –

0

下面是如何注册同一类型

@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

你还在做新的'MyService()'我想要服务是组件 –

+0

为什么它对你很重要? –

+0

因为你是什么这与我上面所做的没有什么不同。 –