Wie dynamisch eine Methode auf einem qualifizierten Service anrufen?

Hazzo:

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 typeSpalte 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 typeZeichenfolge, erhält die Instanz der entsprechenden SolverDienstinstanz , von denen die Qualifikations dass gleich sind type? Ich glaube , dass @Autowiredkann hier nicht verwendet werden, da ich Bohnen dynamisch zur Laufzeit benötigen.

Nikolai Shevchenko:

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

@Qualifierverwendet wird , mit entlang @Autowiredist die richtige Bohne , um sicherzustellen , injiziert

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

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=389834&siteId=1
Empfohlen
Rangfolge