在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
。