どのように動的に資格のあるサービスのメソッドを呼び出すには?

Hazzo:

私は、次のようにインターフェースを持っています:

public interface Solver {
    void execute(final String definition);
}

私はいくつかのソルバーの実装を持っています。例えば:

@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) {
    }
}

さて、私のデータベースに私は、次のようにこれらのソルバーのデータを持っています:

type:       textual - examples: simple, naive
definition: textual

このデータをフェッチする場合、私はマップする必要がtype、それは提供を解決することができますので、実際のサービスインスタンスに列をdefinition

だから、私の質問はこれに沸く:私は、与えられたことができますどのようにtype文字列を、対応のインスタンスを取得Solver修飾子はそれと同等となっているサービスインスタンスをtype私は信じている@Autowired私は、実行時に動的に豆を見つける必要があるとして、ここでは使用することはできません。

ニコライシェフチェンコ:

春4以来、あなたは、Beanの修飾子がキーで、豆自体が価値ある地図に複数のimplemetationsをautowireすることができます

@Autowired
private Map<String, Solver> solvers;

void doStuff() {
    String type = ... // obtain type
    Solver solver = solvers.get(type);
    solver.execute(...)
}

更新

Beanを命名する正しい方法ではありません

@Qualifier("naive")
@Service

だが

@Service("naive")

@Qualifier使用されている@Autowired正しいBeanが注入されていることを確認します

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

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=389840&siteId=1