当我使用 @Autowired 注解来引用类时,会发生什么类型的自动装配?如果在 XML 中不使用 "autowire" 属性来定义 bean,会怎样?

8 浏览
0 Comments

当我使用 @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配置时是否存在错误?

0
0 Comments

由于没有在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"属性来明确指定自动装配的方式。

0