Мой вариант использования - создать список бинов «B», каждый из которых имеет свой экземпляр зависимого бина «C».
@Component("a")
public class A{
List<B> bPool = new ArrayList<>();
private ApplicationContext appContext;
@Autowired
A(ApplicationContext appContext){
this.appContext = appContext;
}
@PostConstruct
public void init(){
for(int i=0; i<POOL_SIZE; i++){
bPool.add((B) appContext.getBean("b"));
}
}
//code for multi-threading, which uses beans from the list bPool.
//I iterate the list, launch multiple threads,
//pass different data to each thread and combine results.
List<CompletableFuture> multiThreads = new ArrayList<>();
Iterator it = bPool.iterator();
for(Data d : listOfSomeData){ //same size for listOfSomeData and bPool
CompletableFuture var = CompletableFuture.supplyAsync(() -> {
B curr = (B) it.next()
curr.someMethodInB(d);
});
multiThreads.add(var);
}
multiThreads.forEach(cf -> cf.join());
}
@Component("b")
@Scope("prototype")
public class B{
//Service class - has some dependencies, like C below
private C c;
private ApplicationContext appContext;
@Autowired
B(ApplicationContext appContext){
this.appContext = appContext;
}
@PostConstruct
public void init(){
c = (C) appContext.getBean("c");
}
}
@Component("c")
@Scope("prototype")
public class C{
//this class holds some data and does some processing on it,
//I want this to be different for different instances in different threads.
}
При создании списка B в bPool при построении (Iпроверяется путем печати в пост-конструкции), каждый экземпляр B устанавливается для каждого B соответственно.
Однако при использовании экземпляров B позже из того же пула все экземпляры B имеют одинаковый Cinstance.
Все они имеют экземпляр C, для которого был установлен последний созданный элемент B в bPool.
Я новичок в Springboot и не могу понять это поведение.Любая помощь приветствуется.Спасибо