在Spring中重构这个的最佳方法是什么?

private final ExecutorService executorParsers = Executors.newFixedThreadPool(10); public void parse(List objs) { //... bunch of elided stuff .... CompletionService parserService = new ExecutorCompletionService(executorParsers); for (final AsupStoreObj obj : objs) { parserService.submit(new ParseThread(obj)); } } 

我想DI“ParseThread”但肯定有一个更好的方法来做到这一点,而不是在原型范围内的bean上调用getBean,因为我是Spring的新手,我想我会问……

以下是使用lookup-method的完整配置(参见3.4.6.1查找方法注入 ):

           

和Java代码:

 abstract class Foo { @Autowired CompletionService parserService; protected abstract ParseThread createThread(); public void parse(List objs) { for (final AsupStoreObj obj : objs) { ParseThread t = createThread(); t.setObject(obj); parserService.submit(t); } } } 

遗憾的是,您无法将任何参数传递给lookup-method (请参阅SPR-7431和我的文章使用lookup-method按需创建原型Spring bean ),因此需要使用人工setObject()

如果你不喜欢abstract方法/类,查找方法可以是非抽象的无操作方法或(更好)默认实现可以抛出exception。 Spring将在运行时覆盖实现,有效地为您调用getBean()

额外奖励:我Executor / CompletionService翻译为Spring托管bean。 请注意,Spring支持这些开箱即用的function: 任务执行和调度 。

好吧,我不确定你认为Spring会在这里给你带来什么,但是我会注入一个吐出Runnable / Callable的工厂。

 private final ExecutorService executorParsers = Executors.newFixedThreadPool(10); @Autowired private CallableFactory myCallableFactory = new MyCallableFactory(); //create this factory public void parse(List objs) { //... bunch of elided stuff .... CompletionService parserService = new ExecutorCompletionService(executorParsers); for (final AsupStoreObj obj : objs) { parserService.submit(myCallableFactory.createCallable(obj)); } } 

您也可以使用Spring注入ExecutorService