1。一辆简单的车
首先我们考虑一个简单的例子,这里我们使用引擎类和汽车类。为了更加清楚的描述问题,我们将类和接口都置空。每辆汽车会有一个引擎,我们想给车装备上著名的MooseEngine。
引擎类如下:
<>之前,1,public interface Engine {2大敌; ,3},4, ,5 public class  SlowEngine implements Engine {6大敌; ,7},8, ,9 public class  FastEngine implements Engine {10, 11,12}, 13,public class  MooseEngine implements Engine {14, 15,}
,
然后我们可以得到一个汽车类:
1, public class Car {2, 3,,,,,,,,private MooseEngine 发动机;4, 5,}
这是一辆非常棒的汽车,但是即使有其他种类的引擎上市,我们也不能装备这些引擎了。我们说这里的汽车类和MooseEngine类是紧耦合的(紧密耦合)。虽然MooseEngine很棒,但是如果我们想把它换成别的引擎呢?
,
回到顶部
2。接口编程
,你可能已经注意到了MooseEngine实现了引擎接口。其它引擎也实现了同样的接口。我们可以想一想,当我们设计我们的汽车类时,我们想让一辆“车”装备一个“引擎”,所以我们重新实现一个汽车类,这次我们使用引擎接口:
1, public class Car {2, 3,,,,,,,,,private Engine 发动机;4, 5,}
接口编程是依赖注入中的一个很重要的概念。我听到了你的尖叫,“等一下,你在这里使用接口,具现类(具体类)该怎么办?你在哪里设置(套)引擎吗?我想在我的汽车中装备MooseEngine”。我们可以按下面的方式来设置它:
1, public class Car {2, 3,,,,,,,,,private Engine Engine =, new MooseEngine (); 4, 5,}
但这就是有用的么?它看上去和第一个例子没有多大区别。我们的汽车仍然同MooseEngine是紧耦合的。那么,我们该如何设置(或者说注入(注入))我们的汽车引擎呢?
回到顶部
3。依赖注入介绍
就像依赖注入这个名字一样,依赖注入就是注入依赖,或者简单的说,设置不同实例之间的关系。一些人将它同好莱坞的一条规矩关联了起来,“不要给我打掉话,我打给你。”我更喜欢叫它“家伙”法则说:“我不关心你是谁,按我说的做。”在我们的第一个例子中,汽车依赖的是发动机的具现类MooseEngine。当一个类一个依赖于另外一个B类的时候,B类的实现直接在类一个中设置,我们说一个紧耦合于B第二个例子中,我们决定使用接口来代替具现类MooseEngine,这样就使得汽车类更加灵活,并且我们决定不去定义引擎的具现类实现。换句话说,我们使汽车类变为松耦合(松散耦合)的只需使用了. Car不再依赖于任何引擎的具现类了。那么在哪里指定我们需要使用哪个引擎呢?依赖注入该登场了。我们不在汽车类中设置具现化的引擎类,而是从外面注入。这又该如何实现呢?,
3.1使用构造函数来注入依赖
设置依赖的一种方法是把依赖类的具体实现传递给构造函只需使用数. Car类将会变成下面这个样子:
<>之前,1,public class Car {2大敌; ,3,,,,,,,,private Engine 发动机;,4, ,5,,,,,,,,public 汽车(Engine 引擎),{,6 ,7,,,,,,,,,,,,,,,this.engine =,引擎;,8, ,9日,,,,,,,,}10, 11,}
然后我们就可以用任何种类的引擎来创建汽车了。例如,一个汽车使用MooseEngine,另外一个使用蹩脚的SlowEngine:
<>之前,1,public class Test {2大敌; ,3,,,,,,,,public static void main (String [], args),{4大敌; ,5,,,,,,,,,,,,,,,Car myGreatCar =, new 汽车(new MooseEngine ());, 6, ,7,,,,,,,,,,,,,,,Car hisCrappyCar =, new 汽车(new SlowEngine ());, 8, ,9日,,,,,,,,}10, 11,}