我正在读春天(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处理Java配置是否存在错误?
答案 0 :(得分:12)
documentation解释了这个
对于后备匹配, bean名称被视为默认限定符 值。因此,您可以使用id“main”而不是。来定义bean 嵌套的限定符元素,导致相同的匹配结果。 但是,尽管您可以使用此约定来引用特定的 bean的名称
@Autowired
基本上是关于类型驱动的注入 使用可选的语义限定符。这意味着限定符值, 即使使用bean名称回退,也总是有缩小语义 在类型匹配集内;他们没有语义表达 引用唯一的bean id
所以,不,这不是一个错误,这是预期的行为。如果by-type autowiring没有找到一个匹配的bean,bean id(name)将被用作后备。