Standardmäßig sind Spring Beans Singletons. Ich frage mich, ob es eine Möglichkeit gibt, mehrere Instanzen derselben Bean für die Verarbeitung zu erhalten.
Folgendes mache ich derzeit
@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);
}
}
}
Hier ist die Serviceklasse
public class MyService implements Runnable {
private String name;
public Myservice(int i){
name=String.ValueOf(i);
}
}
Ich habe meinen Usecase hier vereinfacht. Ich möchte MyService als Spring Bean haben und so viele wie möglich basierend auf der Konfiguration (die num
ist) in der obigen for-Schleife erhalten. Ich frage mich, wie das möglich ist.
Vielen Dank
Zuerst müssen Sie MyService
zu einer Spring Bean machen. Sie können dies tun, indem Sie die Klasse mit @Component
kommentieren. Wie Sie bereits sagten, handelt es sich bei Spring Beans standardmäßig um Singletons. Dies kann also mit einer weiteren Annotation geändert werden - @Scope("prototype")
.
Ein Prototyp des Bean-Bereichs bedeutet, dass jedes Mal, wenn Sie Spring nach einer Instanz der Bean fragen, eine neue Instanz erstellt wird. Dies gilt für Autowiring, die Abfrage des Anwendungskontexts nach der Bean mit getBean()
oder die Verwendung einer Bean Factory.
Hier ist ein einfaches Beispiel, wie eine gewünschte Anzahl von Beans des gleichen Typs registriert wird
@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 {
}
}