は(3.4.6.1 Lookup method injectionを参照)lookup-method
を使用して完全な構成です:
<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()
の必要性があります。
abstract
のメソッド/クラスが嫌いな場合、ルックアップメソッドは抽象的なノーオペレーションメソッドであるか、デフォルトの実装で例外をスローすることができます。 Springは実行時に実装をオーバーライドし、効果的にgetBean()
を呼び出します。
ボーナス:Executor
/CompletionService
をSpring管理Beanにも翻訳しました。 Springはこれらのアウト・オブ・ザザボックスをサポートしていることに注意してください:Task Execution and Scheduling。
スプリングDIでは、オブジェクトをPOJOのようにする必要があります。だからこそ、あなたのコードをどこに置くことができるか、私はある種の考え方をすることができるいくつかの方法があります。あなたがしようとしているものに対して、より大きなスニペットといくつかの追加のコンテキストを提供できますか? –
あなたのParseThreadはAsupStoreObject以外の他の依存関係を持っていないようです...この場合は...あなたは春に何をしたいですか? – Dapeng
私の意図は、ParseThread呼び出し可能コードを挿入できるように、このコードをParseThreadの特定の実装に結びつけるのではなく、それらを束縛するのではなく、より簡単に切り替えることでした。 – user1085751