[英]Does Spring @Autowired inject beans by name or by type?
我正在讀初春(威利出版社)書。 在第二章中,有一個關於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配置時是否存在錯誤?
文檔說明了這一點
對於后備匹配, bean名稱被認為是默認的限定符值。 因此,您可以使用id“ main”而不是嵌套的qualifier元素定義bean,從而得到相同的匹配結果。 但是,盡管您可以使用此約定按名稱引用特定的bean,但
@Autowired
基本上是關於帶有可選語義限定符的類型驅動的注入 。 這意味着,即使帶有Bean名稱后退的限定符值,在類型匹配集合中始終具有較窄的語義。 他們沒有在語義上表示對唯一bean id的引用
因此,不,這不是錯誤,而是預期的行為。 如果按類型自動裝配找不到單個匹配的Bean,則將Bean ID(名稱)用作備用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.