J'ai une interface comme suit:
public interface Solver {
void execute(final String definition);
}
J'ai plusieurs implémentations de solveur. Par exemple:
@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) {
}
}
Maintenant, dans ma base de données que j'ai les données pour ces solveurs comme suit:
type: textual - examples: simple, naive
definition: textual
Lors de l' extraction de ces données, je dois cartographier la type
colonne à l'instance de service réel, il peut donc résoudre le fourni definition
.
Donc, ma question se résume à ceci: comment puis - je, donné une type
chaîne, obtenir l'instance du correspondant Solver
instance de service dont le qualificatif est égal à celui type
? Je crois que @Autowired
ne peut être utilisé ici, comme je l' ai besoin de trouver des haricots dynamiquement lors de l' exécution.
Depuis le printemps 4, vous pouvez autowire plusieurs implemetations dans une carte où qualificatif de haricot est une clé, et la fève elle-même est une valeur
@Autowired
private Map<String, Solver> solvers;
void doStuff() {
String type = ... // obtain type
Solver solver = solvers.get(type);
solver.execute(...)
}
Mise à jour
Manière correcte de nommer un haricot est pas
@Qualifier("naive")
@Service
mais
@Service("naive")
@Qualifier
est utilisé en même temps que @Autowired
d'assurer la fève correct est injecté
@Autowired
@Qualifier("naive")
private Solver naiveSolver;