Spring dependency injection unit test: 1つのマッチするBeanを期待したが、2つ見つかった。
2022-03-16 16:45:12
例外メッセージ:org.springframework.beans.factory.Exception:
原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: このビーンには、[com.byd.mes.bussiness.service. ExecuteActivityService] という型のユニークなビーンは定義されていません。
解決策
Qualifier
Autowiredは、型に基づいて自動組み立てされます。上記の例では、SpringコンテキストにUserDao型のBeanが複数ある場合はBeanCreationException例外が投げられ、SpringコンテキストにUserDao型のBeanがない場合はBeanCreationException例外が投げられています。これらの問題を解決するために、@Qualifierを@Autowiredと併用することができます。
1. UserDaoのインスタンスが複数存在する可能性がある
[java]です。
@Autowired
public void setUserDao(@Qualifier("userDao") UserDao userDao) {
this.userDao = userDao;
}
こうすることで、SpringはidがuserDaoであるビーンを見つけ、アセンブルすることができます。
2. UserDaoのインスタンスが存在しない可能性がある
[java]です。
@Autowired(required = false)
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
Springは独自の@Autowiredアノテーションだけでなく、JSR-250仕様で定義されている@Resource、@PostConstruct、@PreDestroyというアノテーションもサポートしています。
Resourceは@Autowiredと同等ですが、@Autowiredは自動的にbyTypeで注入されるのに対し、@Resourceはデフォルトで自動的にbyNameで注入される点が異なります。Resourceアノテーションのname属性はBeanの名前に解決し、type属性はBeanの型に解決する。つまり、name属性を使用するとbyName自動注入ポリシーが使用され、type属性を使用するとbyType自動注入ポリシーが使用されます。name属性もtype属性も指定されない場合は、リフレクション機構を通じてbyName自動注入ポリシーが使用されます。
リソースアセンブリの順序
1. nameとtypeの両方が指定された場合、唯一マッチするBeanがアセンブリ用のSpringコンテキストから見つかり、見つからない場合は例外がスローされる
2. nameが指定された場合、コンテキストから一致する名前(id)を持つBeanを見つけて組み立てる、見つからない場合は例外を投げる
3. type が指定されている場合、その type に一致するユニークな Bean をコンテキストから見つけてアセンブルし、見つからない場合や複数見つかった場合は例外を投げる。
4. name も type も指定されない場合、自動的に byName としてアセンブルする。マッチするものがない場合、マッチするオリジナルのタイプにフォールバックし、マッチする場合は自動的にアセンブルする。
Resourceは@Autowiredと同等ですが、@Autowiredは自動的にbyTypeで注入されるのに対し、@Resourceはデフォルトで自動的にbyNameで注入される点が異なります。Resourceアノテーションのname属性はBeanの名前に解決し、type属性はBeanの型に解決する。つまり、name属性を使用するとbyName自動注入ポリシーが使用され、type属性を使用するとbyType自動注入ポリシーが使用されます。name属性もtype属性も指定されない場合は、リフレクション機構を通じてbyName自動注入ポリシーが使用されます。
リソースアセンブリの順序
1. nameとtypeの両方が指定された場合、唯一マッチするBeanがアセンブリ用のSpringコンテキストから見つかり、見つからない場合は例外がスローされる
2. nameが指定された場合、コンテキストから一致する名前(id)を持つBeanを見つけて組み立てる、見つからない場合は例外を投げる
3. type が指定されている場合、その type に一致するユニークな Bean をコンテキストから見つけてアセンブルし、見つからない場合や複数見つかった場合は例外を投げる。
4. name も type も指定されない場合、自動的に byName としてアセンブルする。マッチするものがない場合、マッチするオリジナルのタイプにフォールバックし、マッチする場合は自動的にアセンブルする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例