加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

浅谈依赖注入

发布时间:2020-12-14 05:12:33 所属栏目:百科 来源:网络整理
导读:?? 最近在学习Spring和Angularjs,在学习的过程中依赖注入这个名词反复出现在各个文档和链接当中,迫使你不得不去了解下这个概念。依赖注入(Dependence Injection,DI)又和控制反转(Inversion of Control,IoC)有关。可以说DI是IoC的一种设计模式,按照DI的

?? 最近在学习Spring和Angularjs,在学习的过程中依赖注入这个名词反复出现在各个文档和链接当中,迫使你不得不去了解下这个概念。依赖注入(Dependence Injection,DI)又和控制反转(Inversion of Control,IoC)有关。可以说DI是IoC的一种设计模式,按照DI的思路可以实现IoC。
其实这个东西没那么神奇,几句话就能讲清楚的事情。我看了中文的几个资料,发现能把这个件事情说得比较简洁明了的文章不是太多,大部分都给我一种简单问题复杂化的感觉。有两篇文章说得不错(我等下会在参考链接中给出),依赖注入是由一个外国人提出的,他的原文文章我没有看过,一方面是因为我英语真的太差,读Wiki都很吃力,一方面也是因为没有那种深入研究到底的精神。
??至于IoC容器,是为了解决重复性的劳动。其实依赖注入的过程并不复杂,并没有太高的技术含量。如同洗衣服一样,当项目比较大或者依赖关系比较复杂时,我们再手工地写这些重复性的机械代码是很没意思和繁琐的。因此就和洗衣机的出现了一样,做一个IoC容器来帮我们解决依赖。如何实现一个IoC容器呢?这里我先不展开了,一是因为一篇文章介绍下来有点难,而是我自己也没掌握。不过我可以给看官提供一个Link,有兴趣的同学可以看一下。
??依赖注入实际上就是指物体A依赖于物体B。再直白点可以说建造物体A的同时也必须建造物体B。用代码表示如下:

public class StuffA{
    private StuffB stuffB = new StuffB();

    public void work(){
        stuffB.doSomeThing();
    }
}

public class StuffB{
    public void doSomeThing(){
        /*.some code */
    }
}

??其实如果确定了这是一个永远不会变的需求这样写也无所谓。不过如果哪天需求改变了,我们不用StuffB了,这种情况就面临一个问题代码从头到尾都需要改,如果代码年旧失修,又是一个新人过来修改你的代码,那需要一个很大的勇气。所以一直强调的设计模式,耦合性之类的就是为了写出可复用,便于修改的代码。
为了解决这个问题,我们有以下思路。第一种最容易想到的是通过构造函数。代码如下:

public class StuffA{
  private Stuff stuff;
  public StuffA(Stuff stuff){
    this.stuff = stuff;
  }
  public void work(){
    stuff.doSomeThing();
  }
}

??通过在构造对象时的方式来削弱这种依赖性。
??我们也可以通过属性属性来注入,用伪代码表示如下:

public class StuffA{
  private Stuff stuff;

  public Stuff getStuff(){
    return this.stuff;
  }

  public void setStuff(Stuff stuff){
    this.stuff = stuff ;
  }
  public void work(){
    stuff.doSomeThing();
  }
}

??这种比较适合相依的物件和外部环境有互动的时候。
??第三种是通过参数注入

public class StuffA{
  public void work(Stuff stuff){
    stuff.doSomeThing();
  }
}

参考链接:

IoC容器
依赖注入

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读