Spring @Autowired是按名称还是按类型注入bean?

时间:2015-05-20 21:20:31

标签: java spring configuration code-injection autowired

我正在读春天(wiley press)的书。在第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;
    }
    ...
}

当我运行代码时,它可以工作。但我期望一个例外,因为我在配置中定义了两个具有相同类型的bean。

我意识到它的工作原理如下:

  • 如果Spring遇到多个具有相同类型的bean,则会检查字段名称。
    • 如果找到一个具有目标字段名称的bean,它会将该bean注入该字段。

这不是错的吗? Spring处理Java配置是否存在错误?

1 个答案:

答案 0 :(得分:12)

documentation解释了这个

  

对于后备匹配, bean名称被视为默认限定符   值。因此,您可以使用id“main”而不是。来定义bean   嵌套的限定符元素,导致相同的匹配结果。   但是,尽管您可以使用此约定来引用特定的   bean的名称@Autowired基本上是关于类型驱动的注入   使用可选的语义限定符。这意味着限定符值,   即使使用bean名称回退,也总是有缩小语义   在类型匹配集内;他们没有语义表达   引用唯一的bean id

所以,不,这不是一个错误,这是预期的行为。如果by-type autowiring没有找到一个匹配的bean,bean id(name)将被用作后备。