gpt4 book ai didi

java - 在 Spring 中重构这个的最佳方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:45 24 4
gpt4 key购买 nike

private final ExecutorService executorParsers = Executors.newFixedThreadPool(10);

public void parse(List<MyObjInt> objs) {
//... bunch of elided stuff ....

CompletionService<AsupParseObj> parserService = new ExecutorCompletionService<AsupParseObj>(executorParsers);

for (final AsupStoreObj obj : objs) {
parserService.submit(new ParseThread(obj));
}
}

我想对“ParseThread”进行 DI,但肯定有比在原型(prototype)作用域 bean 上隐藏对 getBean 的调用更好的方法,因为我是 Spring 的新手,我想我会问......

最佳答案

这是使用 lookup-method 的完整配置(参见 3.4.6.1 Lookup method injection ):

<bean id="executorParsers" class="java.util.concurrent.Executors" 
factory-method="newFixedThreadPool"
destroy-method="shutdownNow">
<constructor-arg value="10"/>
</bean>

<bean id="parserService" class="java.util.concurrent.CompletionService">
<constructor-arg ref="executorParsers"/>
</bean>

<bean id="foo" class="Foo">
<lookup-method name="createThread" bean="parseThread"/>
</bean>

<bean id="parseThread" class="ParseThread" scope="prototype" lazy-init="true"/>

Java 代码:

abstract class Foo {

@Autowired
CompletionService parserService;

protected abstract ParseThread createThread();

public void parse(List<MyObjInt> objs) {
for (final AsupStoreObj obj : objs) {
ParseThread t = createThread();
t.setObject(obj);
parserService.submit(t);
}
}
}

不幸的是,您不能将任何参数传递给lookup-method(参见SPR-7431 和我的文章Creating prototype Spring beans on demand using lookup-method),因此需要人为的setObject()

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

奖励:我也将 Executor/CompletionService 翻译成 Spring 管理的 bean。请注意,Spring 支持这些现成的:Task Execution and Scheduling .

关于java - 在 Spring 中重构这个的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8416655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com