@AutoWired和@Resource的区别

@Resoure@Autowire
注解来源JDKSpring
装配方式优先按照名称优先按照类型,通常配合@Qualifier使用
可扩展性因为是JDK的,所以可扩展性较强,可以换成另外的框架扩展性较差,只能在spring中使用

@Autowire+@Qualifier = @Resource


@Resource默认按名称装配,当找不到与名称匹配的bean时才按照类型进行装配。名称可以通过name属性指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,当注解写在setter方法上时,默认取属性名进行装配。

@Resource装配顺序

  1. 如果同时指定name和type,则从容器中查找唯一匹配的bean装配,找不到则抛出异常
  2. 如果指定name属性,则从容器中查找名称匹配的bean装配,找不到则抛出异常
  3. 如果指定type属性,则从容器中查找类型唯一匹配的bean装配,找不到或者找到多个抛出异常
  4. 如果都不指定,则自动按照byName方式装配,如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配
  • @AutoWired
  1. AutoWired注解,先按照类型查找。
  2. 如果找到了一个匹配类型的就注入,如果没有找到就报错
  3. 如果找到两个及以上,就按照变量值查找,如果找到了,就注入,没有找到就报错,这个时候,可以配合使用@ Qualifier进行注入。

现在有如下的类
在这里插入图片描述
接口Car:

package cn;
import org.springframework.stereotype.Component;
@Component
public interface Car  {
}

接口Car的两个实现类

package cn;
import org.springframework.stereotype.Component;
@Component
public class BigCar  implements  Car {
}

package cn;
import org.springframework.stereotype.Component;
@Component
public class SmallCar  implements  Car {
}

Person类

package cn;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Person{
    @Autowired
    private Car car;
    public Car getCar() {
        return car;
    }
}

在Person中包含了Car,如果这个时候同时将Car的两个实现类,都放到容器中,注入会出现错误。

NoUniqueBeanDefinitionException: No qualifying bean of type ‘cn.Car’ available: expected single matching bean but found 2: bigCar,smallCar。如果将其中的Car car;改变成为Car bigCar,或者smallCar,会注入成功。
也就是说当在容器中找到多个类型一样的类的时候,这个时候autowired会按照变量值来查找。
@Autowired也可以配合@Qualifier来使用,查找变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值