码迷,mamicode.com
首页 > 其他好文 > 详细

IoC 的类型

时间:2015-11-17 12:21:25      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

  从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。Spring 支持构造函数注入和属性注入。下面我们继续使用以上的例子说明这三种注入方法的区别。

  1.构造函数注入
在构造函数注入中,我们通过调用类的构造函数,将接口实现类通过构造函数变量传入,如代码清单3-3 所示:

  代码清单 3-3 MoAttack:通过构造函数注入革离扮演者                  

public class MoAttack {
    private GeLi geli;
     //①注入革离的具体扮演者
    public MoAttack(GeLi geli){
        this.geli = geli;
    }
    public void cityGateAsk(){
        geli.responseAsk("墨者革离!");
    }
}

  MoAttack 的构造函数不关心具体是谁扮演革离这个角色,只要在①处传入的扮演者按剧本要求完成相应的表演即可。角色的具体扮演者由导演来安排,如代码清单3-4 所示:

  代码清单 3-4 Director:通过构造函数注入革离扮演者            

public class Director {
    public void direct(){
        //①指定角色的扮演者
        GeLi geli = new LiuDeHua();
        //②注入具体扮演者到剧本中
        MoAttack moAttack = new MoAttack(geli);
        moAttack.cityGateAsk();
    }
}

  在①处,导演安排刘德华饰演革离的角色,并在②处,将刘德华“注入”到墨攻的剧本中,然后开始“城门叩问”剧情的演出工作。

  2.属性注入
  有时,导演会发现,虽然革离是影片《墨攻》的第一主角,但并非每个场景都需要革离的出现,在这种情况下通过构造函数注入并不妥当,这时可以考虑使用属性注入。属性注入可以有选择地通过Setter 方法完成调用类所需依赖的注入,更加灵活方便:

  代码清单 3-5 MoAttack:通过Setter 方法注入革离扮演者            

public class MoAttack {
    private GeLi geli;
    //①属性注入方法
    public void setGeli(GeLi geli) {
        this.geli = geli;
    }
    public void cityGateAsk() {
        geli.responseAsk("墨者革离");
    }
}

  MoAttack 在①处为geli 属性提供一个Setter 方法,以便让导演在需要时注入geli 的具体扮演者。

  代码清单 3-6 Director:通过Setter 方法注入革离扮演者          

public class Director {
    public void direct(){
        GeLi geli = new LiuDeHua();
        MoAttack moAttack = new MoAttack();
        //①调用属性Setter方法注入
        moAttack.setGeli(geli);
        moAttack.cityGateAsk();
    }
}

  和通过构造函数注入革离扮演者不同,在实例化MoAttack 剧本时,并未指定任何扮演者,而是在实例化MoAttack 后,在需要革离出场时,才调用其setGeli()方法注入扮演者。按照类似的方式,我们还可以分别为剧本中其他诸如梁王、巷淹中等角色提供注入的Setter方法,这样,导演就可以根据所拍剧段的不同,注入相应的角色了。

  

  3.接口注入
  将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。为了采取接口注入的方式,必须先声明一个ActorArrangable 接口:

public interface ActorArrangable {
    void injectGeli(GeLi geli);
}

  然后,MoAttack 实现ActorArrangable 接口提供具体的实现:

  代码清单 3-7 MoAttack:通过接口方法注入革离扮演者                

  

public class MoAttack implements ActorArrangable {
    private GeLi geli;
    //①实现接口方法
    public void injectGeli (GeLi geli) {
        this.geli = geli;
    }
    public void cityGateAsk() {
        geli.responseAsk("墨者革离");
    }
}

  Director 通过ActorArrangable 的injectGeli()方法完成扮演者的注入工作。

  代码清单 3-8 Director:通过接口方法注入革离扮演者              

public class Director {
    public void direct(){
        GeLi geli = new LiuDeHua();
        MoAttack moAttack = new MoAttack();
        moAttack. injectGeli (geli);
       moAttack.cityGateAsk();
    }
}

  由于通过接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注入并无本质区别,因此我们不提倡采用这种方式。

IoC 的类型

标签:

原文地址:http://www.cnblogs.com/zhangtongzct/p/4970979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!