Java 在春天重构它的最好方法是什么? private final executor服务executorParsers=Executors.newFixedThreadPool(10); 公共void解析(列表objs){ //…一堆被省略的东西。。。。 CompletionService parserService=新的ExecutionCompletionService(executorParsers); 用于(最终AsupStoreObj obj:objs){ submit(新的parserService(obj)); } }

Java 在春天重构它的最好方法是什么? private final executor服务executorParsers=Executors.newFixedThreadPool(10); 公共void解析(列表objs){ //…一堆被省略的东西。。。。 CompletionService parserService=新的ExecutionCompletionService(executorParsers); 用于(最终AsupStoreObj obj:objs){ submit(新的parserService(obj)); } },java,spring,Java,Spring,我想对“ParseThread”进行DI,但肯定有比在原型范围的bean上隐藏对getBean的调用更好的方法,因为我是Spring的新手,我想我会问…以下是使用查找方法的完整配置(请参阅): Java代码: <bean id="executorParsers" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool" destroy-method="shut

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

以下是使用
查找方法的完整配置(请参阅):


Java代码:

<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"/>
抽象类Foo{
@自动连线
CompletionService parserService;
受保护的抽象ParseThread createThread();
公共void解析(列表objs){
用于(最终AsupStoreObj obj:objs){
ParseThread t=createThread();
t、 setObject(obj);
parserService.submit(t);
}
}
}
不幸的是,您无法将任何参数传递给
查找方法
(请参阅和我的文章),因此需要使用人工
setObject()

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


另外:我还将
Executor
/
CompletionService
翻译成了Spring管理的bean。请注意,Spring支持这些开箱即用的功能:。

好吧,我不确定您认为Spring会在这里为您带来什么,但我会注入一个某种工厂,它提供
可运行的
/
可调用的

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);
        }
    }
}
private final executor服务executorParsers=Executors.newFixedThreadPool(10);
@自动连线
private CallableFactory myCallableFactory=new myCallableFactory()//创建这个工厂
公共void解析(列表objs){
//…一堆被省略的东西。。。。
CompletionService parserService=新的ExecutionCompletionService(executorParsers);
用于(最终AsupStoreObj obj:objs){
submit(myCallableFactory.createCallable(obj));
}
}

您还可以使用Spring注入执行器服务。

使用Spring DI,您需要使对象更像POJO。考虑到这一点,我有几种方法可以想象你可以在哪里使用你的代码。你能提供一个更大的代码片段和一些额外的上下文吗?看起来你的ParseThread除了AsupStoreObject之外没有任何其他依赖项。。。在这种情况下。。。您希望spring提供什么帮助?我的目的是能够注入ParseThread可调用项,这样我就可以更轻松地切换/模拟这些调用项,而不是将这些代码绑定到特定的ParseThread实现上。对于spring版本3.0.5,我必须将java.util.concurrent.CompletionService更改为java.util.concurrent.ExecutionCompletionService,因为CompletionService是一个接口,所以由于不明确,实例化无法成功。
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);
        }
    }
}
private final ExecutorService executorParsers = Executors.newFixedThreadPool(10);

@Autowired
private CallableFactory myCallableFactory = new MyCallableFactory(); //create this factory

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

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

   for (final AsupStoreObj obj : objs) {
      parserService.submit(myCallableFactory.createCallable(obj));
   }
}