Ich habe eine Schnittstelle, wie folgend:
public interface Solver {
void execute(final String definition);
}
Ich habe mehrere Solver-Implementierungen. Zum Beispiel:
@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) {
}
}
Nun, in meiner Datenbank habe ich die Daten für diese Löser, wie folgend:
type: textual - examples: simple, naive
definition: textual
Wenn diese Daten zu holen, muss ich die zur Karte type
Spalte der tatsächlichen Dienstinstanz, so dass er die vorgesehenen lösen kann definition
.
So kochte meine Frage an diese nach unten: Wie kann ich einen bestimmten type
Zeichenfolge, erhält die Instanz der entsprechenden Solver
Dienstinstanz , von denen die Qualifikations dass gleich sind type
? Ich glaube , dass @Autowired
kann hier nicht verwendet werden, da ich Bohnen dynamisch zur Laufzeit benötigen.
Seit 4 Spring können Sie mehrere implemetations in eine Karte, wo Bean Qualifier ist ein Schlüssel, und die Bohne selbst ist ein Wert autowire
@Autowired
private Map<String, Solver> solvers;
void doStuff() {
String type = ... // obtain type
Solver solver = solvers.get(type);
solver.execute(...)
}
Aktualisieren
Die richtige Weg, um eine Bohne zu benennen ist nicht
@Qualifier("naive")
@Service
aber
@Service("naive")
@Qualifier
verwendet wird , mit entlang @Autowired
ist die richtige Bohne , um sicherzustellen , injiziert
@Autowired
@Qualifier("naive")
private Solver naiveSolver;