2011-04-20 10 views
5

Soy bastante nuevo en Sprint y estoy usando Spring 3.xy Roo1.1.1 para mi aplicación.Cómo utilizar @Autowired para aplicar dinámicamente la implementación como un patrón de fábrica

Tengo una implementación múltiple de una interfaz que sería @Autowired en otras clases diferentes. Solo podría decidir qué implementación usar en el tiempo de ejecución. Esto se debe lograr con un patrón de fábrica.

public interface SomeInterface { 
    public void doSomething(); 
} 

Implementación 1.

public class SomeOb implements SomeInterface { 
    public void doSomething() { 
     //Do something for first implementation here 
    } 
} 

Implementación 2.

public class SomeOtherOb implements SomeInterface { 
    public void doSomething() { 
     //Do something for first implementation here 
    } 
} 

Ahora en mi servicio que necesitaba este Autowired como

@Service 
public class MyService { 

    @Autowired 
    SomeInterface ob; 
    //Rest of the code here 

} 

1) La lógica de elegir qué implementación para ser Autow solo se conoce el tiempo de ejecución, por lo que no puedo usar la anotación @Qualifier para calificar esto. 2) que trataron de crear un FactoryBean como

public class SomeFactoryBean implements FactoryBean<SomeInterface> { 
@Override 
public SomeInterface getObject() throws Exception { 
    if(/*Somecondition*/) { 
     return new SomeOb(); 
    } else 
     return new SomeOtherOb(); 
} 

@Override 
public Class<? extends SomeInterface> getObjectType() { 
    if(/*Somecondition*/) { 
     return SomeOb.class; 
    } else 
     return SomeOtherOb.class; 
} 

@Override 
public boolean isSingleton() { 
    return false; 
} 
} 

En el applicationContext.xml tengo la etiqueta mencionada.

Cuando corro el servidor web me encuentro con un error como

No unique bean of type [com.xxxx.xxxx.SomeInterface] is defined: expected single matching bean but found 3: [xxxx, xxxxxxx, xxxxFactory] 

Puede alguien por favor me ayude a resolver este problema. Si no estoy haciendo esto bien, por favor diríjanme a hacer esto de la manera correcta.

Gracias y agradecería cualquier ayuda, jjk

Respuesta

0

rendimiento verdadero de isSingleton() si sólo se necesita una implementación del grano para una instancia determinada de su aplicación

Pero cuestionan su diseño.

Siempre usaría archivos de propiedades para cambiar implementaciones como esta. Una vez tuve que implementar la integración de CAPTCHA para un sitio. Estábamos creando prototipos con las API de JCaptcah y ReCAPTCHA. Creé una nueva interfaz que contenía solo la funcionalidad que necesitábamos y luego creé implementaciones para ambas API. Usando un marcador de posición en el archivo de configuración de Spring y en los perfiles de Maven, podríamos cambiar la clase de implementación en tiempo de compilación o tiempo de implementación, por ejemplo, mvn embarcadero: ejecutar -DcaptchaImpl = recaptcha o -DcaptchaImpl = jcaptcha.

Sin saber la tarea que desea lograr, es difícil proporcionar más consejos.

3

Gracias por la sugerencia. Pude resolver el problema con la ayuda de un colega. Lo que estaba haciendo mal

  1. que tenía la aplicación de la SomeInterface con @Service. Así que esto fue recogido por el escáner de primavera y añadido al frijol.
  2. Durante la prueba y error eliminé la anotación @Component de la implementación de FactoryBean.

Después de hacer estos cambios, funcionó a las mil maravillas.

Cuestiones relacionadas