Par défaut, les haricots de printemps sont des singletons. Je me demande s'il existe un moyen d'obtenir plusieurs instances du même bean pour le traitement.
Voici ce que je fais actuellement
@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);
}
}
}
Voici la classe Service
public class MyService implements Runnable {
private String name;
public Myservice(int i){
name=String.ValueOf(i);
}
}
J'ai simplifié mon cas d'utilisation ici. Je veux avoir MyService comme bean de printemps et en obtenir autant que possible en fonction de la configuration (qui est num
) dans la boucle for ci-dessus? se demandant comment cela est possible.
Merci
Vous devez d'abord faire de MyService
un bean Spring. Vous pouvez le faire en annotant la classe avec @Component
. Ensuite, comme vous le dites, les beans Spring sont des singletons par défaut, donc cela peut être modifié avec une annotation de plus - @Scope("prototype")
.
Une portée de bean prototype signifie que chaque fois que vous demandez à Spring une instance du bean, une nouvelle instance sera créée. Cela s'applique à Autowiring, demandant le contexte d'application du bean avec getBean()
, ou utilisant une fabrique de bean.
Voici un exemple simple de la façon d'enregistrer un nombre souhaité de beans du même 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 {
}
}