1. ホーム
  2. spring

アノテーションで指定されたビーン名が既存の非互換なビーンdefと衝突している。

2023-10-09 05:15:11

質問

いくつかのSpringビーン定義で問題が発生しています。私のmain()メソッドによって読み込まれるいくつかのコンテキストxmlファイルがあり、それらの両方がほとんどタグだけを含んでいます。私のメインメソッドが起動すると、Springからこのエラーが表示されます。

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl]

DAOクラスはどちらもこのようにアノテーションされています。

@Repository("converterDAO")
public class StaticConverterDAOImpl implements ConverterDAO {
...
}

インメモリDaoは@Repository("converterDAO")アノテーションも持っています。このように他のクラスでダオが参照されます。

...
private @Autowired @Qualifier("converterDAO") ConverterDAO converterDAO;
...

私は、1つのDAOが他のDAOの定義を上書きすることを望んでいます。これは、私がいつも理解しているように、最初の段階でDIフレームワークを使用する主な理由の1つです。私は何年も前からxmlの定義でこれをやっていますが、何の問題もありませんでした。しかし、コンポーネントスキャンやアノテーションされたビーン定義ではそうではないのですか?また、Springが「互換性がない」と言うのはどういう意味でしょうか?これらは同じインターフェースを実装しており、そのインターフェース型のフィールドに自動配線されています。なぜ互換性がないのでしょうか?

誰か、アノテーションされ、コンポーネントスキャンされたビーンが別のものをオーバーライドする方法を教えてくれませんか?

-マイク

どのように解決するのですか?

XMLファイルでは、一連の宣言が存在し、前の定義を新しい定義で上書きすることができます。アノテーションを使用する場合、アノテーションの概念はありません。 の前に または の後に . すべてのビーンが同じレベルにあります。同じ名前のビーンを2つ定義しているので、Springはどちらを選ぶべきかわからないのです。

異なる名前をつけて ( staticConverterDAO , inMemoryConverterDAO など)、Spring XMLファイル内にエイリアスを作成し( theConverterDAO など)を作成し、コンバータをインジェクションする際にこのエイリアスを使用します。

@Autowired @Qualifier("theConverterDAO")