2017-02-21 72 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

因爲你是什麼這與我上面所做的沒有什麼不同。 –