Tengo una situación en la que me gustaría crear dinámicamente un objeto a través de un objeto de fábrica, pero el objeto debe crearse a través del contexto de primavera para permitir el autoenvío de dependencias. Sé que hay muchas otras maneras en que puedo resolver este problema, por ejemplo, utilizando un patrón de localización de servicios, pero me gustaría hacerlo de esta manera si es posible.Uso del método de fábrica de instancias para crear beans prototipo dinámicamente
Imagínese que tengo dos objetos:
class OuterObject {
List<InnerObjectInterface> innerObjs;
...
}
class InnerObject implements InnerObjectInterface{
@Autowired
SomeDependency someDependency;
...
}
Quiero crear una fábrica que hace algo a lo largo de las líneas de:
class OuterObjectFactory {
private innerObject = new InnerObject();
public OuterObject construct(params){
OuterObject o = new OuterObject();
List<InnerObjectInterface> inners = new ArrayList<InnerObjectInterface>();
...
for(some dynamic condition){
...
inners.add(createInnerObject());
...
}
}
public createInnerObject(){
return innerObject;
}
}
Mi primavera-context.xml haría ve algo como:
<bean id="outerObjectFactory" class="path.OuterObjectFactory" />
<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" />
Sin embargo, esto no funciona. Solo se crea un innerObject, donde quiero que actúe como si tuviera scope = "prototype". Si añado scope = "prototipo" a la definición de frijol:
<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" scope="prototype"/>
Entonces parece crear muchos innerObjects, pero no están conectados correctamente. Mi compañero de trabajo cree que la documentación encontrada here implica que el bean de fábrica solo se usa para inicializar un bean, pero no me parece obvio.
Agradecería que alguien pudiera aclarar mi entendimiento aquí, y posiblemente incluso sugerir una mejor manera de modelar el patrón de fábrica con el cableado de lo que estoy haciendo.
Gracias!
Resulta que esto realmente no funciona para prototipos de frijoles. Sin embargo, me condujo a la inyección de métodos, que resuelve el problema, no tan limpiamente, pero muy bien. Gracias masa – idbentley