• 三种依赖注入的方式


    依赖注入(DI)是控制反转(IoC)的一种方式。

    那么在IoC模式中,被注入对象又是通过那些方式来通知 IoC Service Provider为起提供服务的呢?

    三种依赖方式:构造函数方法注入、Setter方法注入与接口注入。

    构造函数方法注入:

    setter方法注入:

     

    接口注入:

    参考:书籍《spring揭秘》

    参考博客:https://www.cnblogs.com/weidagang2046/archive/2009/12/10/1620587.html

    那么依赖注入对象与我们自己创建对象,到底应该是一种怎样的关系呢?

    DI和对象创建谁也不能取代谁,应该根据情况采用合理的设计。那么我们自然要问,合理的标准在哪里呢,有没有明确的指导方针供我们设计时参考呢?答案是有!那就是对象间关系。在OO中,对象间关系的大致可分为两类:纵向关系和横向关系。纵向主要指继承关系,比较容易区分;但横向关系比较微妙。从本文的例子中我们已经明显感觉到了横向关系是需要仔细区分的。

    按UML建议横向关系大体分为4种,它们的耦合程度由弱到强:

    依赖 < 关联 < 聚合 < 组合

    1. 依赖(Dependency):语义“a uses b”,a依赖于b,但不持有b的引用;比如:现实世界的例子有“人对空气的依赖关系”,在程序中a.f(b)可以理解为a对b的依赖(或者说对b的类型B的依赖),b作为a的方法参数,a内部成员变量不引用b。

    1

    2. 关联(Association):语义“a has b”,a拥有b的引用,但a和b无从属关系,二者是一种松散的关联关系,可以随时解除或建立;比如本文中“人与汽车关系”。

    2

    3. 聚合(Aggregation):语义“a owns b”,a拥有b的引用,且有从属关系,二者的耦合比关联更强,但a并不负责b的生命周期。在程序中,b并非a专有的内部实现细节;除a以为,外部也可能引用b。比如,”汽车和轮胎关系”,汽车不负责轮胎的生产,汽车报废了轮胎或许还可以继续使用。

    3

    4. 组合(Composition):语义“b is a part of a”,a不仅拥有b的引用,还应该全权负责b的整个生命周期,在程序中b通常是a的内部实现细节,不暴露给外部;比如本文中人与心脏的关系。

    4

    我们注意这四种关系中有一个关键的概念“对象生命周期”,在建模时辨别清楚对象生命周期就不难选择采用DI还是创建对象。DI意味着使用者不负责依赖对象的生命周期,创建对象则相反。对应到上面的4种横向关系,我们一般可以这样处理:第1种依赖关系不需要DI也不需要创建对象;第2,3种关联和聚合关系适合采用DI方式,最后一种组合关系适合采用创建对象方式。

    注入方式的比较我们也讨论了,那么构造函数与setter在什么样的情况下适合呢?

    通过具体例子来体会二者的区别:“人与身份证的依赖关系”适合采用Setter注入,因为人不是一出生就有身份证,而是到了法定年龄才有,用构造函数注入表达的语义与此相违背。相反“人与父母的依赖关系”则适合采用构造函数注入,因为亲子关系是从人一出生就建立的,用Setter注入必然使得对象创建后有一段时间处于非法状态,按契约式设计的术语即破坏了对象的不变量(invariant)。

  • 相关阅读:
    查看linux版本的三种常用方法
    CentOS和Redhat发行版linux内核版本的对应关系
    swift的异常处理:本质是错误信息的传递方式
    构建法则第一条:有什么材料做什么饭
    待解决问题 代码阅读
    iOS: 聊聊 Designated Initializer(指定初始化函数):NS_DESIGNATED_INITIALIZER
    整合与构建的能力是创造性思维的重要体现
    iOS网络缓存的系统实现是一个烂尾工程
    (动态)代理于HOOK的区别于关系
    iOS 网络缓存总结
  • 原文地址:https://www.cnblogs.com/levontor/p/11040029.html
Copyright © 2020-2023  润新知