/ / Spring @AutowiredはBeanを名前または型で挿入しますか? - Java、Spring、設定、コードインジェクション、オートワイヤード

Spring @AutowiredはBeanを名前または型で挿入しますか? - Java、Spring、設定、コードインジェクション、オートワイヤード

私は春(ワイリープレス)の本を読んでいます。第2章では、 Javaの設定と @Autowired。それはこれを提供する @Configuration クラス

@Configuration
public class Ch2BeanConfiguration {

@Bean
public AccountService accountService() {
AccountServiceImpl bean = new AccountServiceImpl();
return bean;
}

@Bean
public AccountDao accountDao() {
AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
//depedencies of accountDao bean will be injected here...
return bean;
}

@Bean
public AccountDao accountDaoJdbc() {
AccountDaoJdbcImpl bean = new AccountDaoJdbcImpl();
return bean;
}
}

この通常のBeanクラス

public class AccountServiceImpl implements AccountService {

@Autowired
private AccountDao accountDao;

public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
...
}

コードを実行すると動作します。しかし、構成内に同じタイプの2つのBeanを定義しているため、例外が予想されました。

私はそれが次のように動作することを認識した:

  • Springが同じ型の複数のBeanを検出すると、フィールド名をチェックします。
    • ターゲットフィールドの名前を持つBeanが見つかると、そのBeanをフィールドに挿入します。

これは間違っていませんか?SpringのJava設定の処理にはバグがありますか?

回答:

回答№1は6

ドキュメンテーション これを説明する

フォールバックマッチでは、 Bean名はデフォルトの修飾子と見なされます 値。 したがって、あなたはidの代わりに "main"というidを持つBeanを定義することができます 同じネストされた修飾子要素を返します。 ただし、この規約を使用して特定の 名前で豆、 @Autowired 基本的にタイプドリブンインジェクション オプションのセマンティック修飾子付き。これは、修飾子の値、 Bean名のフォールバックがあっても、常に狭義のセマンティクスを持つ タイプマッチのセット内。彼らは意味論的に表現していない 一意のBean IDへの参照

by-type autowiringが単一の一致するbeanを見つけられない場合、bean id(name)はフォールバックとして使用されます。これはバグではありません。