在我的基于Spring Boot的应用程序中,我有一个@Component类,其代码类似于:
ExecutorService executorService = Executors.newFixedThreadPool(poolSize);
// Start a separate thread for each entry
Map<Long, Future<Integer>> calls = new HashMap<>();
for (MyClass info : list) {
Callable<Integer> callable = new TableProcessor(info);
Future<Integer> future = executorService.submit(callable);
calls.put(info.getId(), future);
}
AutoWiring在TableProcessor类中不起作用,因为(我认为)我正在使用'new'创建一个实例。 “为列表中的每个条目创建新实例”的最佳方法是什么?
注意:在这种情况下,向Application类添加'Bean'是行不通的,因为我想为每个线程创建一个新实例。
答案 0 :(得分:2)
我有类似的问题,我使用ApplicationContext解决了它。
这是一个例子,因为我喜欢看代码而不是解释事情,所以也许它可以帮助同一条船上的人:
首先,这里是我要创建一个新实例的Spring组件:
@Component
@Scope("prototype")
public class PopupWindow extends Window{
private String someVar;
@PostConstruct
public void init(){
//stuff
someVar="hi";
}
}
这里是我想要这个Spring组件的2个实例的类:
@Component
@Scope("session")
public class MainWindow extends Window{
private PopupWindow popupWindow1;
private PopupWindow popupWindow2;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void init(){
popupWindow1 = applicationContext.getBean(PopupWindow.class);
popupWindow2 = applicationContext.getBean(PopupWindow.class);
}
}
在我的特定情况下,我使用Vaadin + Spring,这些注释使用Vaadin版本,即@SpringComponent和@UIScope而不是@Scope(&#34; session&#34;)。但@Scope(&#34;原型&#34;)是一样的。