`

IOC与依赖注入模式

    博客分类:
  • java
阅读更多

1.IOC及注入模式简介
    为什么要用IOC,参见《为什么要用IOC
    IOC并不能清晰地解释类与类之间依赖的解耦关系,软件界的泰斗级人物Martin Fowler提出了DI(依赖注入:Dependency Injection)的概念,即将客户类对接口实现类的依赖关系由第三方(容器或协作类)注入,以移除客户类对具体接口实现类的依赖。
    我们使用抽象接口来隔离使用者和具体实现之间的依赖关系,但是不管再怎么抽象,最终还是要创建具体实现类的实例,这种创建具体实现类的实例对象就会造成对于具体实现的依赖,为了消除这种创建依赖性,需要把依赖移出到程序的外部(比如配置文件)。
    使用依赖注入后,这些类完全是基于抽象接口编写而成的,所以可以最大限度地适应需求的变化。依赖注入的形式有三种,分别为构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。

2.举例说明
现有一个服务接口,只有一个行为,
   Interface IService{
      go();
   }
Service类是接口IService的实现者
   public Service implements IService{
      public void go() {
         ...
      }
   }

Consumer类想调用这个服务,最原始的方法:
   public Consumer{
      private IService service = null;

      public Consumer(){
         service=new Service ();
      }

      public void doSomething() {
         service.go();
      }
   }

3.构造子注入
通过构造函数,将接口的具体实现类注入进来。代码如下
    public Consumer{
      private IService service = null;

      public Consumer(IService service){
         this.service=service
      }

      public void doSomething() {
         service.go();
      }
    }
调用过程如下
    Service service=new Service();
    Consumer consumer=new Consumer(service);
    consumer.doSomething();

4.Setter方法注入
    public Consumer{
      private IService service = null;

      public SetService(IService service){
         this.service=service
      }

      public void doSomething() {
         service.go();
      }
    }
调用过程如下
    Service service=new Service();
    Consumer consumer=new Consumer();
    consumer.SetService(service);
    consumer.doSomething();

5.接口注入
接口注入是指将客户类所有注入的方法抽取到一个接口中,客户类通过实现这一接口提供注入的方法。为了采取接口注入的方式,需要声明一个额外的接口:
    public interface Injectable{
       void injectService(IService service);
    }
Consumer类通过继承Injectable接口注入
    public Consumer implements Injectable{
      private IService service = null;

      public injectService(IService service){
         this.service=service;
      }

      public void doSomething() {
         service.go();
      }
    }
调用过程如下:
    Service service=new Service();
    Consumer consumer=new Consumer();
    consumer.injectService(service);
    consumer.doSomething();

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

6.类与类之间依赖的管理

   类与类之间的依赖关系实现了解耦,但是类的实例化和类与类之间的注入依然是存在的,只是这个工作被延后并且由另外的类来完成,我们把管理这些类的实例化和对类与类之间关系进行管理的模块称之为第三方容器。
    这种容器帮助我们完成类的初始化和装配工作,让我们从这些底层的实现类实例化,依赖关系的装配中脱离出来,专注于更有意思的业务代码的编写工作,那确实是挺惬意的事情。Spring就是这样一个容器,它通过配置文件描述类之间的依赖关系,下面是Spring配置文件的对以上实例进行配置的样式代码:

    <beans>
        <bean id="myservice" class="com.Service"></bean>
        <bean id="consumer" class="com.Consumer">
            <property name="service"><ref bean="myservice"/></property>
        </bean>
    </beans>

    通过new XmlBeanFactory(“beans.xml”)等方式即可启动容器,在容器启动时,Spring根据配置文件的描述信息,通过Java的反射机制自动实例化Bean并完成依赖关系的建立,从容器中即可返回准备就绪的Bean实例,以待后续的使用。

分享到:
评论

相关推荐

    .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...

    IoC容器和DependencyInjection模式

    字——“依赖注入”(Dependency Injection),并将其与“服务定位器”(Service Locator) 模式作一个比较。不过,这两者之间的差异并不太重要,更重要的是:应该将组件的配置与使用 分离开——两个模式的目标都是...

    IOC容器和DI模式.Martin Fowler

    本文中,作者深入探索IOC模式的工作原理,给它一个更能描述其特点的名字——“依赖注入”(Dependency Injection),并将其与“服务定位器”(Service Locator)模式作一个比较。不过,这两者之间的差异并不太重要,...

    .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)

    主要介绍了.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Martin Fowler 控制反转与依赖注入

    在本文中,我将深入探索这个模式的工作原理,给它一个更能描述其特点的名字——“依赖注入”(Dependency Injection),并将其与“服务定位器”(Service Locator)模式作一个比较。不过,这两者之间的差异并不太...

    详解asp.net core 依赖注入

     依赖注入,全称是“依赖注入到容器”, 容器(IOC容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器中,可以“解析”出这个类的实例。所以依赖注入就是把有依赖关系的类放入容器...

    SpringIOC和AOP原理设计模式

    依赖注入:获得依赖对象的过程由自身管理变为了由IOC容器主动注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 AOP最多听到的就是面向切面编程,那对于这个名词,我第一次听到的时候也是不能...

    auryn:IoC依赖注入器

    auryn是一个递归依赖注入器。 使用auryn引导并连接SOLID,面向对象PHP应用程序。 怎么运行的 除其他外,auryn基于在类构造函数签名中指定的参数类型提示来递归实例化类依赖关系。 这需要使用反射。 您可能听说过...

    Ioc模式例子

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。

    (一)spring 的依赖注入,您了解多少?

     依赖注入的模式,依赖注入模式一般分为两类:手动注入和自动注入。  手动模式即配置或者编程的方式,提前安排注入规则,包括xml资源配置元信息、java注解配置元信息和api配置信息,xml资源配置元信息,是比较常见...

    PHP依赖注入(DI)和控制反转(IoC)详解

    首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量。...

    详解Spring的核心机制依赖注入

    依赖注入(Dependency Injection) = 控制反转(Inversion ofControl,IoC):当某个Java实例(调用者)需另一个Java实例(被调用者)时,在依赖注入模式下,创建被调用者的工作不再由调用者来完成,因此称为 控制反转 ;...

    Spring框架分为哪七大模块

    Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。 2.Spring...

    DI 设计模式.docx

    拜读过Martin Fowler大师的关于IOC容器和DI模式的大作,深感受益匪浅,恰逢正在开发的项目使用了这种技术,因此也想班门弄斧,谈一下自己对IOC容器以及依赖注入的一点理解。 仅凭自己对Martin Fowler大师的大作一点...

    绝对深层次IOC和AOP的理解

    实现IOC的主要设计模式是工厂模式。 AOP(面向切面)是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程 (OOP)。 AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    依赖注入是IoC的主要实现方式 IoC的实现机制: 工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,通过工厂加载产生需要的类对象。 ② AoP(Aspect Oriented Programing) --&gt; 面向...

    DITranquillity:iOS的依赖注入(Swift)

    语言切换:,关于依赖注入依赖注入是一种软件设计模式,其中有人将依赖关系传递给对象。 是更广泛技术的一种形式,有助于有关更多详细信息,您可以阅读此链接另外,我建议您阅读词汇表,这将有助于更好地理解术语。...

    herdic:具有 nodejs 依赖注入的轻量级应用程序引导框架

    我想要像 AngularJS 模块模式这样的东西,它带有服务、提供者和自动依赖注入。 我还想确保可以将各种应用程序组件加载到单元测试中,而不必经历 DI 系统的开销。 该模块尝试在服务器端 nodejs 项目中使用 angularJS...

    typescript nodejs 依赖注入实现方法代码详解

    依赖注入通常也是我们所说的ioc模式,今天分享的是用typescript语言实现的ioc模式,这边用到的主要组件是 reflect-metadata 这个组件可以获取或者设置元数据信息,它的作用是拿到原数据后进行对象创建类似C#中的反射...

Global site tag (gtag.js) - Google Analytics