2009-07-28 17 views
8

Estoy tratando con una base de código heredado donde una clase que no está cableada en primavera necesita obtener una clase que es cableado en primavera. Esperaba crear una clase de fábrica que estuviera conectada al inicio y luego simplemente llamar al método getInstance() para obtener un objeto cableado. ¿Cuál es la mejor manera de hacerlo?Alambre de resorte una clase estática

Ejemplo:

public class LegacyA { 
    public void doSomething() { 
     ... 
     Foo foo = FooFactory.getInstance(); 
     ... 
    } 
} 

public class FooFactory { 
    private static Foo foo; 

    public static Foo getInstance() { 
     if (foo == null) throw new IllegalStateException(); 
     return foo; 
    } 
} 

necesito FooFactory ser cableado en el arranque de modo que LegacyA simplemente puede llamar getInstance() de manera que devuelve una instancia de Foo (que es también un grano se define en el contexto de aplicación)

<bean id="legacyA" class="LegacyA"/> 

<bean id="foo" class="Foo"/> 

<!-- I need this bean to be injected with foo so that the FooFactory can return a foo --> 
<bean id="fooFactory" class="FooFactory"/> 

Editar: tenía que volver a trabajar mi ejemplo un poco, ya lo tengo un poco Confuzzled en mi propia cabeza ...

+0

¿Cómo se inyecta Foo en FooFactory? Un setter, constructor, ...? – wds

Respuesta

10

El uso de la estática como esto realmente va a contrapelo de la primavera COI, pero si realmente tiene usarlos, entonces le sugiero escribir un simple gancho de resorte que toma la Foo y lo inyecta en la FooFactory, por ejemplo,

public class FooFactoryProcessor implements InitializingBean { 

    private Foo foo; 

    public void setFoo(Foo foo) { 
     this.foo = foo; 
    } 

    public void afterPropertiesSet() throws Exception { 
     Foofactory.setFoo(foo); 
    } 
} 

Y en el código XML:

<bean id="foo" class="Foo"/> 

<bean class="FooFactoryProcessor"> 
    <property name="foo" ref="foo"/> 
</bean> 

No hay necesidad de modificar o FooFooFactory

+0

de acuerdo en lo que respecta a su comentario estático. Normalmente, nunca iría por esa ruta, sin embargo, el código heredado usa esta clase estática en todas partes y la mejor manera de enganchar este nuevo objeto de resorte sin romper el código existente es mantener las llamadas a la clase estática anterior y tener esa estática clase use el nuevo y mejorado objeto con cable de primavera. – digiarnie

+2

¿Por qué no dejas que Spring administre FooFactory directamente? Realmente no necesita la abstracción es "FooFactoryProcessor". Puede agregar un ajustador de propiedades no estático a FooFactory para configurar foo en él. –

+0

Esto es cierto, sí, pero estaba siguiendo la línea del menor número de cambios en el código heredado, que es lo que parecía ser el OP. – skaffman

1

está definiendo el frijol como singleton en la configuración de la primavera de uso aquí ? Luego puede inyectarlo en LegacyB usando la propiedad o el constructor inject (mi preferencia es la última) y luego solo está disponible la instancia única.

EDITAR: Re. su pregunta cambiada (!) No estoy seguro de por qué no simplemente inyecta Foo nuevamente como singleton en su fábrica. Tenga en cuenta también que puede usar el método getInstance() a través de las configuraciones de Spring utilizando factory-method, y mantener la inyección a través de todas las clases.

+0

Perdón por tener que cambiar la pregunta ligeramente sobre usted. No me di cuenta hasta poco después de haber tenido toda la pregunta mal en mi cabeza. – digiarnie

+0

Gracias por el aviso. Eso no es un problema. Respuesta modificada apropiadamente. –

1

Además de skaffman de respuesta que hay que tener mucho cuidado con el fin muy inicialización.

Al usar los granos de la primavera, solo el marco determinará automáticamente el orden correcto de inicialización. Sin embargo, tan pronto como estés haciendo trucos de singleton, esto puede romperse si no tienes cuidado.

En otras palabras, asegúrese de que LegacyA no se puede ejecutar antes de que el contexto de la aplicación termine de cargarse.

Cuestiones relacionadas