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调用流程图:
@Inject : 注入,被注解的构造方法会自动编译生成一个Factory工厂类提供该类对象。
@Component: 注入器,类似快递员,作用是将产生的对象注入到需要对象的容器中,供容器使用。
@Module: 模块,类似快递箱子,在Component接口中通过@Component(modules=
xxxx.class),将容器需要的商品封装起来,统一交给快递员(Component),让快递员统一送到目标容器中。
Dagger基础使用
建立bean
建立module
建立component
使用:
rebuild之后会在build中会根据module生成对应的dragger对象!
注意:
需要在app中的build.gradle中添加
不然后面使用daggerxxx会报错
高级使用
模块之间的引用
Dagger会在A moudule 中寻找对象,如果没找到,会去找module B 中是否有被Inject注解的对象,如果还是没有,抛出异常
多模块之间的引用
相同provide中不同实例化对象
这里使用了@name这个注解
使用的时候:
直接创建单例对象
这里使用@Singleston这个注解
注意:
1、如果 moudule所依赖的Comonent 中有被单利的对象,那么Conponnent也必须是单利的
2、单利对象只能在同一个Activity中有效。不同的Activity持有的对象不同
如果要设置全局的单例对象需要做如下设置:
注意:子类component 依赖父类的component ,子类component的Scoped 要小于父类的Scoped,Singleton的级别是Application