私は春(ワイリープレス)の本を読んでいます。第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)はフォールバックとして使用されます。これはバグではありません。