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