IoC 的类型

  从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。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();
    }
}

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

时间: 2024-11-05 18:40:53

IoC 的类型的相关文章

Spring之IoC

什么是IOC 将对象的管理交给Spring容器,对象间的依赖进行解耦,想要某个对象,从Spring容器中进行获取 IOC的类型 构造函数注入:Spring已经实现 成员变量注入:Spring已经实现 接口注入:Spring未实现 实现IOC的Java基础 反射技术等 Spring提供了比JDK更好的访问资源的API:Resource接口 /* * Copyright 2002-2016 the original author or authors. * * Licensed under the

spring IOC(转)

原文 http://stamen.iteye.com/blog/1489223 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓

攻城狮在路上(贰) Spring(二)--- Spring IoC概念介绍

一.IoC的概念: IoC(控制反转)是Spring容器的核心.另一种解释是DI(依赖注入),即让调用类对某一个接口的依赖关系由第三方注入,以移除调用类对某一个接口实现类的一览. 定义如此,由此可见,在面向接口编程的情况下,IoC可以很好的实现解耦,可以以配置的方式为程序提供所需要的接口实现类. 在实际程序开发中,我们只需要提供对应的接口及实现类,然后通过Spring的配置文件或者注解完成对依赖类的装配.二.IoC的类型: 1.通过构造函数: 此种方式的缺点是,在构造函数中注入之后一般会作为一个

ioc解析

引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓来让人应接不暇.在所有贺岁大片中,张之亮的<墨攻>算是比较出彩的一部.该片讲述

IOC概论

一.什么是IOC 维基百科上说到:2004年Martin Fowler 提出了“控制反转的”概念,他得出的结论是:依赖对象的获得被反转了.后来为这个创造了一个更好的名字:依赖注入(IOC = Inversion of Control).简单的解释是:系统的运作是通过两个或多个类的合作来实现业务逻辑,这使得每个对象都需要与其合作的对象的引用(依赖关系),这个依赖对象以前是通过自身实现去获得,现在通过一个容器统一的管理这些依赖关系,从而获得这种依赖的这种实现方式,我们可以成为IOC. 二.使用IOC

看部电影,透透彻彻理解IoC(你没有理由再迷惑!)

引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓来让人应接不暇.在所有贺岁大片中,张之亮的<墨攻>算是比较出彩的一部.该片讲述

透透彻彻IoC

本文转载自:http://stamen.iteye.com/blog/1489223/ 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大

透透彻彻IoC(你没有理由不懂!)

http://www.myexception.cn/open-source/418322.html 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总

IOC控制反转解释(java)

引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓来让人应接不暇.在所有贺岁大片中,张之亮的<墨攻>算是比较出彩的一部.该片讲述