您的位置:首页 > Web前端 > AngularJS

浅谈依赖注入

2016-07-26 23:08 316 查看
   最近在学习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容器

依赖注入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息