依赖注入框架Dagger2—1.入门

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/user11223344abc/article/details/83353650

1.依赖注入

1.1.什么是依赖?

如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。
例如下面类 A 中用到一个 B 对象,我们就说类 A 对类 B 有一个依赖。
同时,这也是一个典型的"依赖非注入"案例。

public class A {
    ...
    B b;
    ...
    public A() {
        b = new B();
    }
}

1.2.什么是依赖注入?

依赖注入就是给一个对象传入一个实例变量。
比如:

public class A {
    ...
    B b;
    ...
    public A(B b) {
        this.b = b;
    }
}

这是一个通过构造函数传参进行注入,在A类里边不再有new B()的操作,所以A不再依赖B,还有通过方法进行注入,比如常见的setXXX(B b)。
这种就是最简单的依赖注入。
更详细请参考:http://blog.51cto.com/cnn237111/928690

1.3.为什么要用依赖注入?

项目中,经常需要在一个对象里去创建另一个对象的实例,这种行为是产生耦合的常见形式,对于一个大型项目来说,过多的相互依赖会导致代码难以维护,如何难以维护?比如A的构造内new了一个B,B的构造变了,那么我们就要去A的构造内修改构建B的代码,这样,地方一多,工作量就会很大。
我们可以通过上面的方式进行依赖注入,但是难免显得简陋,那么在这里可以引出本文要学习的主题—Dagger。

2.Dagger

2.1.什么是Dagger?

在了解了依赖注入之后,再来看Dagger,它是一个依赖注入框架,它在Github主页上的自我介绍是:“A fast dependency injector for Android and Java“(一个提供给Android和Java使用的快速依赖注射器。)
它最开始由Square这个公司出品,后来被google吸收由谷歌来接手维护。

2.2.使用Dagger2的最大好处是什么?它有什么作用?

模块间解耦! 就拿当前Android非常流行的开发模式MVP来说,使用Dagger2可以将MVP中的V 层与P层进一步解耦,这样便可以提高代码的健壮性和可维护性。

2.3.如何理解Dagger2的运作原理?

理解1:

图片防挂链接:https://wx1.sinaimg.cn/mw1024/005BVrqily1fwj79adrf4j30ep073ab0.jpg

为了便于理解,其实可以把component想象成针管,module是注射瓶,里面的依赖对象是注入的药水,build方法是插进患者(Container),inject方法的调用是推动活塞。

理解2:

图片防挂链接:https://wx1.sinaimg.cn/mw1024/005BVrqily1fwj79aizjkj30ii0ap75w.jpg

图片主要分为三部分,左边的是依赖提供者,比如用Module标注的类或者用Injection标注的构造函数,右边的是依赖的需求方,例如我们用inject标注的变量,而Component则是连接两者的桥梁,Component从依赖提供者提供依赖,并把这些依赖注入相关的类中,Dagge正如其名,就像把匕首让依赖能够非常犀利的注入到需要它的地方。

2.4.Dagger2相较于Dagger1的优势是什么?

**更好的性能:**相较于Dagger1,它使用的预编译期间生成代码来完成依赖注入,而不是用的反射。大家知道反射对手机应用开发影响是比较大的,因为反射是在程序运行时加载类来进行处理所以会比较耗时,而手机硬件资源有限,所以相对来说会对性能产生一定的影响。

**容易跟踪调试:**因为dagger2是使用生成代码来实现完整依赖注入,所以完全可以在相关代码处下断点进行运行调试。

3.Dagger2—Hello World

了解了一些概念和原理之后,接下来上手练练。

3.0.库添加

官方项目在这里https://github.com/google/dagger

引入:

    implementation "com.google.dagger:dagger:2.9"
    annotationProcessor "com.google.dagger:dagger-compiler:2.9"

3.1.Hello Dagger

未使用Dagger的时候:


package android.zj.com.zjmine;

public class A {

   public A() {}
}


**********************


public class MainActivity {
    ...
    A a;
    ...
    onCrete(){
		a = new A();
        a.toString();
    }
}

若用了Dagger2:多了一个Component,它是桥梁的意思,谁的桥梁,moudle和container的桥梁,它直接就Moudle-A注入到Container-(inject)-MainActivity里边去了,解耦了依赖,没有去new Object()。这就是一个最简单的Dagger2使用。涉及到的注解就俩 @inject, @Component,当然还有其他属性,不过篇幅限制留到下一篇。

package android.zj.com.zjmine;

public class A {
   @inject
   public A() {}
}


**********************


public class MainActivity {
    ...
    @inject A a;
    ...
    onCrete(){
        //注入,注意这个类DaggerXXXComponent需要提前make一下项目
 	    DaggerMainActivityComponent.builder().build().inject(this);
        a.toString();
    }
}

/**
 *Component必须是一个接口类或者抽象
 */
@Component
interface MainActivityComponent {
    void inject(MainActivity mainActivity);
}

3.总结

本文主要入门了Dagger的一些基础知识,比如什么是依赖?
依赖就是在一个类A中去new另一个类B的对象,这就叫A依赖了B。
什么是依赖注入?
常规的构造方法对变量对象赋值,set方法对变量对象赋值,这就是最简单的依赖注入。
为什么要用依赖注入?
为了减少代码的维护成本,降低项目内代码的耦合性。
为什么要使用Dagger2?
对传统的依赖注入进一步的解耦,通过apt在编译期间在路径\build\generated\source\apt\develop\debug\packagename下动态生成MembersInjector,Factory,Component以达到在需求改变,构造方式,或者其他可变因素改变的情形下,我们不需要改动我们业务组件内的实例化代码(比如Controller,ViewMoudle,Presenter)的这样一种效果,当然Dagger2不仅仅是优化了对象的构造这一项内容,还有其他的高级特性,这受限于研究的深度需要慢慢积累,本文目的是入门。

下一篇:依赖注入框架Dagger2—2.各注解用法

4.参考资料

https://juejin.im/entry/578cf2612e958a00543c45a4 //详解 Dagger2 系列,原来 Dagger2 如此简单
http://blog.51cto.com/cnn237111/928690 //依赖注入的概念
http://blog.51cto.com/zhangjunhd/126530 //控制反转(IoC)与依赖注入(DI)
https://www.jianshu.com/p/b923bd3bc8f4 //注解属性诠释
http://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html //浅谈依赖注入
http://blog.zhaiyifan.cn/2016/03/27/android-new-project-from-0-p4/ //从零开始的Android新项目4 - Dagger2篇
https://blog.csdn.net/Android_Study_OK/article/details/52399548 //“一盘沙拉”带你入门Dagger2
https://www.cnblogs.com/wjtaigwh/p/6740643.html //Dagger2入门到放弃

猜你喜欢

转载自blog.csdn.net/user11223344abc/article/details/83353650