对于下面的代码来说,如果是Spring容器的话,两个注解的功能基本是等价的,他们都可以将bean注入到对应的field中
@Autowired
private Bean beanA;
@Resource
private Bean beanB;
@Component("beanOne")
class BeanOne implements Bean {}
@Component("beanTwo")
class BeanTwo implements Bean {}
@Service
class Test {
// 此时会报错,先byType找到两个bean:beanOne和beanTwo
// 然后通过byName(bean)仍然没办法匹配
@Autowired
private Bean bean;
// 先byType找到两个bean,然后通过byName确认最后要注入的bean
@Autowired
private Bean beanOne;
// 先byType找到两个bean,然后通过byName确认最后要注入的bean
@Autowired
@Qualifier("beanOne")
private Bean bean;
}
@Component("beanOne")
class BeanOne implements Bean {}
@Component("beanTwo")
class BeanTwo implements Bean {}
@Service
class Test {
// 此时会报错,先byName,发现没有找到bean
// 然后通过byType找到了两个Bean:beanOne和beanTwo,仍然没办法匹配
@Resource
private Bean bean;
// 先byName直接找到了beanOne,然后注入
@Resource
private Bean beanOne;
// 显示通过byType注入,能注入成功
@Resource(type = BeanOne.class)
private Bean bean;
}
@Autowired注解默认要求要注入的Bean必须存在,如果找不到匹配的Bean会抛出异常。
@Resource注解默认允许注入的Bean可以缺失,如果找不到匹配的Bean会使用默认值null。