2017-11-13 5 views
1

として豆の1をマーク考えてみましょう、私はこの私のJava Springアプリケーションで@Primary

public class BinarySearchImpl { 

    @Autowired 
    @Qualifier("Quick") 
    SortAlgorithem sorter; 

    Log log=LogFactory.getLog(BinarySearchImpl.class); 

    public BinarySearchImpl(SortAlgorithem sorter) { 
     log.info("Binary Search Bean is created"); 
     this.sorter=sorter; 
    } 

SortAlgorithem書かれているが疎結合自分のアプリケーションを作るのインターフェースでありますこのインターフェイスの2つの実装です

@Component 
@Qualifier("Bubble") 
public class BubbleSort implements SortAlgorithem { 

    Log log=LogFactory.getLog(BubbleSort.class); 

    public int[] sort(int[] numbers) { 
     log.info("Bubble sort is called"); 
     return numbers; 
    } 
} 

そして次にクイックソート:最後に

@Component 
@Qualifier("Quick") 
//@Primary 
public class QuickSort implements SortAlgorithem{ 

    Log log= LogFactory.getLog(QuickSort.class); 

    public int[] sort(int[] numbers) { 
     log.info("Quick Sort is called"); 
     return numbers; 
    } 

} 

私は私のアプリを呼び出すとき、それはと文句を呼び出す:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed 

@Qualifier注釈が動作しない理由を私は疑問に思って?これはあなたの問題を解決する必要があり

@Component("Bubble") 
public class BubbleSort implements SortAlgorithem { 

    Log log=LogFactory.getLog(BubbleSort.class); 

    public int[] sort(int[] numbers) { 
     log.info("Bubble sort is called"); 
     return numbers; 
    } 
} 

@Component("Quick") 
public class QuickSort implements SortAlgorithem{ 

    Log log= LogFactory.getLog(QuickSort.class); 

    public int[] sort(int[] numbers) { 
     log.info("Quick Sort is called"); 
     return numbers; 
    } 

} 

+0

あなたの 'BinarySearchImpl'インスタンスはどのように作成されますか?フィールドインジェクションを使用しているので、なぜそれにコンストラクタparamが必要ですか? – Leffchik

+0

あなたが引用した「検討する」の前に、もう少しテキストがあります。質問にもそれを含めてください。 – slim

答えて

2

@Autowired@Qualifierのフィールドに注釈を付けましたが、フィールドを設定するコンストラクタも作成しました。

私はSpringがコンストラクタを使用していますが、コンストラクタパラメータが注釈付きフィールドに対応していることを自動的には認識しません。

だから、コンストラクタ宣言に注釈を移動:

private SortAlgorithm sorter; 

@Autowired 
public BinarySearchImpl(@Qualifier("quick") SortAlgorithm sorter) { 
    this.sorter = sorter; 
} 

また、あなたは、ゼロ引数のコンストラクタを使用して、あなたのフィールド注釈を維持し、春はリフレクションを使用して注入してみましょうことができます。しかし、私の意見では、コンストラクタの注入が優れています。これは、Springやリフレクションを使わずに、きれいにユニットテストを行うことができます。

他の答えが指摘しているように、autowired beanを曖昧さをなくすための他の方法があります - そしてSpringのドキュメントではそれらをすべて説明しますが、このような修飾子を使用すると動作します。

1

あなたはこのようなあなたのコンポーネントを宣言する必要が

@Component("qualifier_name") 
0

を試してみてください。

+2

はい、質問は "@ Qualifier'が動作しないのはなぜですか? – slim

関連する問題