簡體   English   中英

Spring @Autowired是按名稱還是按類型注入bean?

[英]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遇到多個具有相同類型的bean,它將檢查字段名稱。
    • 如果找到具有目標字段名稱的bean,則將該bean注入該字段。

這不是錯嗎? Spring在處理Java配置時是否存在錯誤?

文檔說明了這一點

對於后備匹配, bean名稱被認為是默認的限定符值。 因此,您可以使用id“ main”而不是嵌套的qualifier元素定義bean,從而得到相同的匹配結果。 但是,盡管您可以使用此約定按名稱引用特定的bean,但@Autowired基本上是關於帶有可選語義限定符的類型驅動的注入 這意味着,即使帶有Bean名稱后退的限定符值,在類型匹配集合中始終具有較窄的語義。 他們沒有在語義上表示對唯一bean id的引用

因此,不,這不是錯誤,而是預期的行為。 如果按類型自動裝配找不到單個匹配的Bean,則將Bean ID(名稱)用作備用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM