2017-02-21 7 views
3

По умолчанию весенние бобы являются одноточечными. Мне интересно, есть ли способ получить несколько экземпляров одного и того же компонента для обработки.Как получить несколько экземпляров одного и того же боба весной?

Вот что я в настоящее время

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

    } 
    } 

Я упростил свой USECASE здесь. Я хочу иметь MyService в качестве весеннего боба и получить как можно больше, основываясь на configuartion (который равен num) в приведенном выше для цикла? интересно, как это возможно.

Благодаря

+0

вы могли бы сделать это с бобовой фабрики из контекста приложения –

+0

@ bart.s: Вы можете привести пример и показать, как это сделать? –

+0

Несомненно, посмотрите ниже ответ –

ответ

8

Сначала вы должны сделать MyService родника боб. Вы можете сделать это, аннотируя класс с помощью @Component. Далее, как вы говорите, весна-бобы по умолчанию являются Singletons, поэтому это можно изменить с помощью еще одной аннотации - @Scope("prototype").

Прообразная область видимости бобов означает, что каждый раз, когда вы запрашиваете Spring для экземпляра компонента, будет создан новый экземпляр. Это относится к Autowiring, запрашивая контекст приложения для компонента с getBean() или с использованием фабрики компонентов.

+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

потому что вы это ничем не отличается от того, что у меня выше. –