Spring @Autowired是按名称还是按类型注入bean?
我正在读初春(威利出版社)的书。在第二章中有一个关于Java配置和Java的示例@Autowired。它提供了这个@Configuration类
@Configurationpublic 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配置时是否存在错误?
回答:
该文档解释了这个
对于后备匹配, 因此,您可以使用id“
main”而不是嵌套的qualifier元素定义bean,从而得到相同的匹配结果。
。这意味着,即使带有Bean名称后退的限定符值,在类型匹配集中也始终具有狭窄的语义。他们没有在语义上表示对唯一bean
id的引用
因此,不,这不是错误,而是预期的行为。如果按类型自动装配找不到单个匹配的Bean,则将Bean ID(名称)用作备用。
以上是 Spring @Autowired是按名称还是按类型注入bean? 的全部内容, 来源链接: utcz.com/qa/435774.html


