繁体   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