Comment appeler dynamiquement une méthode sur un service de qualité?

Hazzo:

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 typecolonne à 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 typechaîne, obtenir l'instance du correspondant Solverinstance de service dont le qualificatif est égal à celui type? Je crois que @Autowiredne peut être utilisé ici, comme je l' ai besoin de trouver des haricots dynamiquement lors de l' exécution.

Nikolai Shevchenko:

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

@Qualifierest utilisé en même temps que @Autowiredd'assurer la fève correct est injecté

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

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=389841&siteId=1
conseillé
Classement