@Autowired注入**required a single bean,but 2 were found**

1590 ワード

いきさつ


簡単な間違いですが、今日プロジェクトにStringRedisTemplateオブジェクトを注入したときはこう書きました.
@Autowired
private StringRedisTemplate redisTemplate;

そして間違ったことを報告しました.
Field redisTemplate in com.xxx.api.controller.XxxController required a single bean, but 2 were found:
  - getRedisTemplate: defined by method 'getRedisTemplate' in class path resource [com/xxx/config/RedisConfig.class]
  - stringRedisTemplate: defined by method 'stringRedisTemplate' in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration$RedisConfiguration.class]

@AutoWiredはタイプ別か、申明された@Qualifier(「beanId」)に従って注入されたと思っていたのですが、私が定義したredisTemplateというfield nameと何の関係がありますか.のしかし、プロジェクトの他の中にはこのように書かれていて、@Qualifierを加えても間違っていません(しかも私が前に使っても間違っていません)、唯一の違いはfieldのnameが違うことで、他の場所はstringRedisTemplateで、私は変えて、本当によかったです.@AutoWiredの以前の理解に従えば、これは明らかに玄学的な操作です.

の原因となる


@Autowired注記の注入規則:
いくつかのコードのテストを経て、AutowiredはデフォルトでTypeを押し、同じTypeで複数のbeanが見つかった場合はNameで比較し、複数ある場合は例外を報告します.
エラーメッセージ:StringRedisTemplateこのタイプのbeanはコンテナプールの中に2つのredisTemplateがあり、stringRedisTemplate(私たち自身のプロジェクトで1つ配置し、spring boot自動配置も追加してくれました)私が定義したのはfieldのnameがredisTemplateでちょうどあり、stringRedisTemplateはあるので問題ありません!

解決する


解決策はたくさんあります.
  • fieldをstringRedisTemplate
  • に変更
  • @Qualifier指定注入bean
  • を使用
  • 場合によっては、競合beanに@Primary【推奨しない】
  • を付ける

    END


    これは私が前にメモしたのはすべて正しいです.それを使っている間にこれらの間違いに出会ったことがありません.だんだん忘れてしまいました.出会ってから注入の流れを深く覚えました.メモの中には重要ではないと思って真剣に覚えていません.大体覚えていますが、問題に直面する前に彼の重要さを発見できませんでした.