Aquí es la configuración completa usando lookup-method
(ver 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"/>
Y el código de 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);
}
}
}
Desafortunadamente no puede pasar ningún parámetro a lookup-method
(ver mi artículo SPR-7431 y Creating prototype Spring beans on demand using lookup-method), de ahí la necesidad de setObject()
artificial.
Si no te gustan los métodos/clases abstract
, el método de búsqueda puede ser un método no abstracto no operativo o (mejor) la implementación predeterminada puede arrojar una excepción. Spring anulará la implementación en tiempo de ejecución, llamando efectivamente al getBean()
por usted.
Bonificación: También traduje Executor
/CompletionService
a Spring managed beans. Tenga en cuenta que Spring admite estos out-of-the-box: Task Execution and Scheduling.
Con Spring DI, necesita hacer que su objeto se parezca más a un POJO. Entonces, dado que hay algunas maneras en que puedo imaginar a dónde puede ir con su código. ¿Puedes proporcionar un fragmento más grande y un contexto adicional para lo que intentas hacer? –
parece que su ParseThread no tiene otra dependencia que no sea AsupStoreObject ... en este caso ... ¿qué desea que la primavera ayude? – Dapeng
Bueno, mi intención era poder inyectar los callables ParseThread de modo que pueda cambiar más fácilmente hacia fuera/burlan de aquellos en vez de estar atado ya que este código es una implementación específica del ParseThread – user1085751