当我使用 @Autowired 注解来引用类时,会发生什么类型的自动装配?如果在 XML 中不使用 "autowire" 属性来定义 bean,会怎样?
当我使用 @Autowired 注解来引用类时,会发生什么类型的自动装配?如果在 XML 中不使用 "autowire" 属性来定义 bean,会怎样?
我正在阅读《Beginning Spring》(Wiley出版社)这本书。在第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();
// accountDao bean的依赖关系将在此处注入...
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配置时是否存在错误?
由于没有在XML中的bean定义中使用"autowire"属性,因此当使用@Autowired对类引用进行注入时,会发生默认的自动装配类型。
出现这个问题的原因是,当没有指定自动装配的方式时,默认使用的是byType自动装配。当使用@Autowired注解时,Spring会查找与被注入字段类型匹配的bean,并将其自动注入到字段中。
解决这个问题的方法是,在XML中使用"autowire"属性来指定自动装配的方式。可以使用以下属性值来指定自动装配的类型:
- no:不进行自动装配,需要手动指定依赖。
- byName:根据字段名进行自动装配。
- byType:根据字段类型进行自动装配。
- constructor:使用构造函数进行自动装配。
- autodetect:根据字段类型进行自动装配,如果有多个匹配的bean,则使用byType进行装配。
通过在XML中使用"autowire"属性进行配置,可以明确指定自动装配的方式,避免默认的byType自动装配可能带来的问题。
通过使用@Autowired注解对类引用进行注入时,默认会使用byType自动装配。如果不在XML中的bean定义中使用"autowire"属性来指定自动装配的方式,可能会导致自动装配出现问题。为了避免这种情况,可以在XML中使用"autowire"属性来明确指定自动装配的方式。