By default, spring beans are singletons. I am wondering if there is a way to get multiple instances of same bean for processing.
Here is what I do currently
@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);
}
}
}
Here is the Service class
public class MyService implements Runnable {
private String name;
public Myservice(int i){
name=String.ValueOf(i);
}
}
I have simplified my usecase here.
I want to have MyService as spring bean and get as many as possible based on configuartion (which is num
) in the above for-loop? wondering how that is possible.
Thanks
First you'll have to make MyService
a Spring bean. You can do this by annotating the class with @Component
. Next, as you say, Spring beans are Singletons by default, so this can be changed with one more annotation - @Scope("prototype")
.
A prototype bean scope means that each time you ask Spring for an instance of the bean, a new instance will be created. This applies to Autowiring, asking the application context for the bean with getBean()
, or using a bean factory.
Here is a simple example of how to register a desired number of beans of the same 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 {
}
}