还不懂「依赖注入」?

131 阅读2分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

依赖 注入

  • 依赖指的是Bean之间的依赖
  • 比如我们养了狗狗,那么让狗狗去看门,或者利用xxx去做什么
public interface Person{
    // 让动物做事情的服务
    public void service();
    // 设置动物
    public void setAnim(Anim animal);
}

public interface Anim{
    public void use();
}
  • 上面一个是人的接口,一个是动物的接口
@Component
public class APerson implement Person {
    @Autowired
    private Anim anim = null;
    @Override
    public void service() {
        this.anim.user();
    }
    @Override
    public void setAnim(Anim animal) {
        this.anim = animal;
    }
}
public class Dog implement Anim {
    @Override
    public void use() {
        System.out.println("狗是用来看门的 + 「」" + Dog.class.getSimpleName);
    }
}
  • 这里有两个实现类,在APerson中使用了@Autowired注解
  • 此注解会根据属性的类型然后去找到相应的Bean注入
  • 而这里面狗狗(Dog)类是动物的一种,所以Spring ioc容器会将Dog的实例注入到Aperson中,
  • 那么这样就可以通过Spring ioc容器来过去Aperson实例的时候
  • 就可以使用Dog类来服务

@Autowired

  • @Autowired注解就是根据类型来注入,那么想到ioc中的getBen来获取Bean,
  • 它有各种不同的getBean,也是根据类型或者名称来获取
  • 但是当我们如果有一只猫又注入到我们的容器中,就会有两个动物,所以ioc容器会抛出异常
  • spring为了消除二义性,就产生了两个注解@Primary和@ Quelifier
  • @Primary注解就是当产生二义性的时候,优先使用有此注解的实例进行注入
  • @Quelifier注解后面可以附上标注如@Quelifier("cat")一旦这样使用,ioc就会以类型和名称去寻找

生命周期

Bean的定义过程

  1. 通过配置以后,@ComponentScan会根据扫描路径去找到带有@Component的类 可以称为定位
  2. 找到资源后就开始解析,并且将定义的信息保存起来,此时还没初始化Bean,仅仅是定义
  3. 然后就将Bean定义发布到ioc容器中,此时还没生成Bean的实例
  • 此时是资源定位和Bean的定义发布到ioc容器的过程
  1. 此后spring就会完成Bean的实例化和依赖注入

在创建Bean的实例对象时就是实例化的时候 在使用@Autowired的时候就是依赖注入的时候