初春(ワイリープレス)の本を読んでいます。第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のJava構成の処理にバグがありますか?
documentation はこれを説明しています
フォールバック一致の場合、Bean名はデフォルトの修飾子値と見なされます。したがって、入れ子になった修飾子の代わりにID「main」でBeanを定義できます要素、同じマッチング結果につながる。 ただし、この規則を使用して、特定のBeanを名前で参照できますが、
@Autowired
は基本的に、オプションのセマンティック修飾子を使用したタイプ駆動型の注入に関するものです。これは、Bean名のフォールバックがあっても、修飾子の値は常に、一致するタイプのセット内でセマンティクスを狭めることを意味します。一意のBean IDへの参照を意味的に表現しない
したがって、いいえ、それはバグではありません。それは意図された動作です。 Bean ID(名前)は、タイプ別の自動配線で一致するBeanが1つも見つからない場合のフォールバックとして使用されます。