Tengo una interfaz de la siguiente manera:
public interface Solver {
void execute(final String definition);
}
Tengo varias implementaciones solucionador. Por ejemplo:
@Qualifier("naive")
@Service
public class NaiveSolver implements Solver {
@Override
public void execute(final String definition) {
}
}
@Qualifier("optimal")
@Service
public class OptimalSolver implements Solver {
@Override
public void execute(final String definition) {
}
}
Ahora, en mi base de datos tengo los datos para estos solucionadores de la siguiente manera:
type: textual - examples: simple, naive
definition: textual
Al recuperar estos datos, necesito un mapa de la type
columna a la instancia de servicio real, por lo que puede resolver el previsto definition
.
Por lo tanto, mi pregunta se reduce a esto: ¿cómo puedo, dada una type
cadena, obtener la instancia de la correspondiente Solver
instancia de servicio de los cuales el calificador es igual a type
? Creo que @Autowired
no se puede utilizar aquí, ya que necesito para encontrar los granos de forma dinámica en tiempo de ejecución.
Desde la primavera 4 puede Autowire múltiples implemetations en un mapa donde calificador frijol es una clave, y el grano en sí es un valor
@Autowired
private Map<String, Solver> solvers;
void doStuff() {
String type = ... // obtain type
Solver solver = solvers.get(type);
solver.execute(...)
}
Actualizar
Forma correcta de nombrar un grano no es
@Qualifier("naive")
@Service
pero
@Service("naive")
@Qualifier
se utiliza junto con @Autowired
para asegurar el grano correcto se inyecta
@Autowired
@Qualifier("naive")
private Solver naiveSolver;