依赖注入(DI-Dependency Injection)

什么是依赖注入

  • 这是一种设计思想,一个面向对象的编程法则。

  • DI能够让开发者写出低耦合代码,更加优良的程序。

  • 更容易测试,代码健壮性更强。

  • 它能使程序的整体结构变的非常灵活。

依赖注入的好处

举个例子

人和车的关系,人有开车的技能,但是他想要开车就必须先找一辆车过来。

public class Car {

    public Car() {
} public void run() {
LogUtils.i("启动汽车");
}
}
public class People {

    private Car mCar;

    public People() {

        mCar = new Car();
} public void driveCar() {
mCar.run();
}
}

通过这两段代码我们可以看出来,People类依赖于Car类,我们需要如何创建一个Car出来,还需要控制何时创建。这是我们传统的写法。如果我们用了DI框架,我们只需要告诉它我们的People类需要依赖一个Car类,具体如何创建Car,何时创建Car,我们并需要知道,通过这样的操作方式我们降低了代码的耦合度,同时也告诉我们为什么叫“依赖注入”,People依赖Car,而Car又需要DI框架将自己注入到People中。

生活中的例子

在饭店未诞生之前也就是人们吃饭需要自己做饭自己找食材

后来社会出现了饭店的概念人们想吃饭只需要去饭店然后点自己想吃的饭就可以了

在后来我们有了外卖的这个概念我们不需要知道饭店在哪里,我们需要吃饭的时候只需要掏出手机点一下就可以了。

分析下三种情况

1.你需要饭怎么做 食材需要自己找(被调用者必须出现在调用者代码里面,而且你还需要知道如何构造调用者)

2.你不需要知道饭是怎么做出来的 你只需要找到饭店即可。(你不需要知道调用者如何构造,但是你自己需要找到工厂。调用者与工厂类耦合在一起)

3.你不需要饭怎么做 也不用知道饭店在哪里 当你饿的时候打开外卖APP就可以了。

(系统调用)

依赖注入的方式

  1. 接口注入
  2. 构造方法注入
  3. Setter 注入

以上三种方式都很简单,但要在合适的时候调用合适的方式很难掌握,需要结合项目本身多加思考,才能灵活应用。

Dragger2解析(一)的更多相关文章

  1. Retrofit2.0+RxJava+Dragger2实现不一样的Android网络架构搭建

    Tamic :csdn http://blog.csdn.net/sk719887916 众所周知,手机APP的核心就在于调用后台接口,展示相关信息,方便我们在手机上就能和外界交互.所以APP中网络框 ...

  2. 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)

    转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  4. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  5. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  9. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

随机推荐

  1. Codeforces 757 D. Felicity's Big Secret Revealed 状压DP

    D. Felicity's Big Secret Revealed   The gym leaders were fascinated by the evolutions which took pla ...

  2. 总结文件操作函数(二)-C语言

    格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf( ...

  3. ubuntu php5.6源码安装

    本系列的lnmp的大框架基本上是按照http://www.linuxzen.com/lnmphuan-jing-da-jian-wan-quan-shou-ce-si-lnmpda-jian-yuan ...

  4. div+css布局教程系列2

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. android 代码优化:关闭输出日志

    android关闭日志 我们在开发时,经常会输出各种日志来debug代码.但是等到应用发布的apk运行时不希望它输出日志. 关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(), ...

  6. 并不对劲的bzoj4197:loj2131:uoj129:p2150:[NOI2015]寿司晚宴

    题目大意 有两个集合\(S_1,S_2 \subseteq [2,n] (n\leq 500)\),且对于\(\forall x\in S_1,y\in S_2 , gcd(x,y)=1\) 求\(S ...

  7. Linux设备模型 (4)

    <Linux设备模型 (2)>和<Linux设备模型 (3)>主要通过一些简单的实作介绍了kobject.kset.kobj_type.attribute等数据结构的用法,但这 ...

  8. SimpliciTI协议栈

    SimpliciTI组网过程介绍 1.SimpliciTI支持点对点和星形的网络拓扑结构.   下面介绍以AP为中心的SimpliciTI网路协议的星形拓扑结构通信过程 1)当ED节点上电之后就扫描信 ...

  9. Java-Runoob-高级教程-实例-字符串:10. Java 实例 - 测试两个字符串区域是否相等-uncheck

    ylbtech-Java-Runoob-高级教程-实例-字符串:10. Java 实例 - 测试两个字符串区域是否相等 1.返回顶部 1. Java 实例 - 测试两个字符串区域是否相等  Java ...

  10. ava Double: 四舍五入并设置小数点位数

    public static void main(String[] args) { // 1. 先乘后四舍五入, 再除; double d = 62.31060027198647; double d2 ...