Dagger2使用学习笔记

Dagger2使用学习笔记

参考:

https://www.jianshu.com/p/2cd491f0da01

http://blog.****.net/mq2553299/article/details/73065745

 

Dragger2是什么:

它是一个依赖注入框架。butterknife也是一个依赖注入框架,我们主要用减少findViewByID或者寻找资源文件带来的不便。而Dagger2主要作用,就是对象的管理,其目的是为了降低程序耦合。这个就厉害了!在activity中有可能会用到很多很多的类,这些类要在activity中进行实例化,这样就导致我们的activity非常依赖这么多的类,这样的程序耦合非常严重。这时候就需要有一个容器(IoC),将这些类放到这个容器里并实例化(关于ioc和耦合,参看http://blog.****.net/u011486491/article/details/70216666

在用到的时候去容器里面取就可以了,我们从依赖类到依赖这个容器,实现了解耦,这就是我所理解的依赖注入,即所谓控制反转;

 

为什么使用Dragger2:

eg:

public class A {

   public void eat() {

       System.out.print("吃饭了");

    }

}

如果项目需要在A中传入对象B,则代码改动为:

public class A {

   private B b;

   public A(B b) {

       this.b = b;

    }

   public void eat() {

       System.out.print("吃饭了");

    }

}

这样A和

 

Dragger2怎么用:

Dragger2调用流程图:

Dagger2使用学习笔记

@Inject : 注入,被注解的构造方法会自动编译生成一个Factory工厂类提供该类对象。

@Component: 注入器,类似快递员,作用是将产生的对象注入到需要对象的容器中,供容器使用。

@Module: 模块,类似快递箱子,在Component接口中通过@Component(modules= 
xxxx.class),将容器需要的商品封装起来,统一交给快递员(Component),让快递员统一送到目标容器中。

 

Dagger基础使用

建立bean

Dagger2使用学习笔记

建立module

Dagger2使用学习笔记

建立component

Dagger2使用学习笔记

使用:

 Dagger2使用学习笔记

rebuild之后会在build中会根据module生成对应的dragger对象!

Dagger2使用学习笔记

注意:

需要在app中的build.gradle中添加

Dagger2使用学习笔记

不然后面使用daggerxxx会报错

高级使用

模块之间的引用

Dagger2使用学习笔记

Dagger2使用学习笔记

Dagger会在A moudule 中寻找对象,如果没找到,会去找module B 中是否有被Inject注解的对象,如果还是没有,抛出异常

多模块之间的引用

Dagger2使用学习笔记

相同provide中不同实例化对象

这里使用了@name这个注解

Dagger2使用学习笔记

使用的时候:

Dagger2使用学习笔记

直接创建单例对象

这里使用@Singleston这个注解

Dagger2使用学习笔记

注意:

1、如果 moudule所依赖的Comonent 中有被单利的对象,那么Conponnent也必须是单利的

Dagger2使用学习笔记

2、单利对象只能在同一个Activity中有效。不同的Activity持有的对象不同

如果要设置全局的单例对象需要做如下设置:

Dagger2使用学习笔记

 

注意:子类component 依赖父类的component ,子类component的Scoped 要小于父类的Scoped,Singleton的级别是Application