Cómo llamar a un método de forma dinámica en un servicio cualificado?

Hazzo:

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 typecolumna 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 typecadena, obtener la instancia de la correspondiente Solverinstancia de servicio de los cuales el calificador es igual a type? Creo que @Autowiredno se puede utilizar aquí, ya que necesito para encontrar los granos de forma dinámica en tiempo de ejecución.

Nikolai Shevchenko:

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")

@Qualifierse utiliza junto con @Autowiredpara asegurar el grano correcto se inyecta

@Autowired
@Qualifier("naive")
private Solver naiveSolver;

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=389843&siteId=1
Recomendado
Clasificación