@Resource 和 @Autowired

@Resource:按名字找bean,没找到再按类型找(如果注解name属性有值,则按该name找,找不到就报错,如果没有设置该属性,才会在按名字找不到的时候再按类型找)

@Autowired:按类型找bean,找不到就按名字找

当这两个注解找到多个bean时,走以下逻辑:

判断能否注入 ——>

判断类型是否为泛型 ——>

@Qualifier ——>

@Primary ——>

@Priority优先级最高 ——>

name(字段的名字,或set方法入参的名字) ——>

通过反射进行属性赋值后者方法调用

findAutowireCandidates 根据类型找beanName的底层流程:

  1. 找出BeanFactory中类型为type的所有的Bean的名字,注意是名字,而不是Bean对象,因为我们可以根据BeanDefinition就能判断和当前type是不是匹配,不用生成Bean对象
  2. 把resolvableDependencies中key为type的对象找出来并添加到result中
  3. 遍历根据type找出的beanName,判断当前beanName对应的Bean是不是能够被自动注入
  4. 先判断beanName对应的BeanDefinition中的autowireCandidate属性,如果为false,表示不能用来进行自动注入,如果为true则继续进行判断
  5. 判断当前type是不是泛型,如果是泛型是会把容器中所有的beanName找出来的,如果是这种情况,那么在这一步中就要获取到泛型的真正类型,然后进行匹配,如果当前beanName和当前泛型对应的真实类型匹配,那么则继续判断
  6. 如果当前DependencyDescriptor上存在@Qualifier注解,那么则要判断当前beanName上是否定义了Qualifier,并且是否和当前DependencyDescriptor上的Qualifier相等,相等则匹配
  7. 经过上述验证之后,当前beanName才能成为一个可注入的,添加到result中

附录:

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;

@Resource由J2EE提供,需要导入包javax.annotation.Resource。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值