2011-04-13 5 views
6

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!

Respuesta

2

Creo que lo que usted dice es que tiene una fábrica que es un singleton y desea crear nuevos objetos de los cuales desea uno nuevo cada vez con inyección de dependencia completa. La forma antigua de hacer eso era la Inyección de Método a la que vinculáis anteriormente. La nueva (y posiblemente más limpia manera) es usar un Proxy con alcance. Puede usar annotations o regular config, pero la idea es crear un proxy alrededor del bean (por ejemplo, InnerObject). Siempre que necesite una referencia, Spring le proporcionará automáticamente una nueva copia con las dependencias apropiadas insertadas.

+1

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

Cuestiones relacionadas