0

WordDao というインターフェイスと、WordDaoImpl という抽象クラスの impl があります。そして、一部の impl クラスはその抽象クラスを拡張します。

それらを注入するときに同じ変数名を使用します。

元:

@Component("subjectService")
public class SubjectDaoImpl extends WordDaoImpl;

@Autowired
private WordDao subjectService;

偽物を追加する前に、すべてがうまく機能します。私の偽のクライアントは、WordDao を拡張するインターフェイスです。

このような:

@FeignClient("Noun")
public interface NounClient extends WordDao;

現在、私の @Autowired クラスはすべて、偽のクライアントを注入しています。 自動配線された結果

偽のクライアントから「extends WordDao」を削除しようとしたところ、再び正常に動作しましたが、理由がわかりません。

私の質問は次のとおりです。春の@autowiredは名前でimplクラスを選択していませんか(変数とクラス/コンポーネント名を一致させようとします)?

4

1 に答える 1

1

FeignClient Bean は、 でprimaryBean を定義するように設定されます@Primary。おそらくそれが、FeignClient Bean が優先的に設定されている理由です。幸い、spring-cloud-netflix 1.3.0から構成可能です。ダルストンリリースで使用できます。

以下のようにコードを変更してみてください。

@FeignClient(name = "Noun", primary = false)
public interface NounClient extends WordDao;

注意すべきことの 1 つは、フォールバック実装で FeignClient を使用している場合、通常は primary が必要であるということです。フォールバックの実装も Spring Bean である必要があります。FeignClient からの実装とフォールバックからの実装の 2 つの実装が存在します。

これが役立つことを願っています。

于 2017-06-01T01:39:28.610 に答える