目录
- 一:Dagger2是什么?
- 二:为什么要有Dagger2
- 三:Dagger2如何使用
- 基本的概念
- 如何使用Dagger2
- 高级用法
(1)构造方法需要其他参数时候
(2) 模块之间的依赖关系
(3) @Named注解使用
(4) @Singleton注解
(5)自定义Scoped
(6)Subcomponent
(7)lazy 和 Provider
- 四: MVP + Dagger2
Ps:文末有架构师进阶资料和面试题资料
一:Dagger2是什么?
是一个依赖注入框架,butterknife也是一个依赖注入框架。不过butterknife,最多叫奶油刀,Dagger2被叫做利器啊,他的主要作用,就是对象的管理,其目的是为了降低程序耦合。
# 二:为什么要有Dagger2
下面我就手写了
public class A {
public void eat() {
System.out.print("吃饭了");
}
}
使用的时候我们就要
A a = new A();
a.eat();
如果现在改了,早A的构造方法中必须传入B对象
public class A {
private B b;
public A(B b) {
this.b = b;
}
public void eat() {
System.out.print("吃饭了");
}
}
那么使用的时候
A a = new A(new B());
a.eat();
可能就有人说了,不就加一个对象么,这里只是我举的一个很简单的例子,看的感觉很简单,但是在实际开发中,如果现在改了一个这个构造方法。是不是意味着,整个项目中的都的改,一不小心, 就是BUG 啊
三:Dagger2如何使用
1. 基本的概念
上来给你说,怎么玩,肯定懵逼,这里我简单说一下几个概念,想有个认知,在往下看,会好很多,Dagger 是通过@Inject使用具体的某个对象,这个对象呢,是由@Provides注解提供,但是呢,这个@Provides只能在固定的模块中,也就是@Module注解,我们查找的时候,不是直接去找模块,而是去找@Component
我们反向推导,当我们使用
@Inject
A a
想要获取a对象的示例的时候,Dagger2 会先去找,当前Activity或者Fragment所连接的桥梁,例如上图中,连接的只有一个桥梁,实际上可以有多个,这个桥梁,会去寻找他所依赖的模块,如图中,依赖了模块A,和模块B,然后在模块中,会去寻找@Providers注解,去寻找A的实例化对象。
2. 如何使用Dagger2
(1) 引入依赖库
Dagger2官网
compile 'com.google.dagger:dagger:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
(2) 创建Moudule
//第一步 添加@Module 注解
@Module
public class MainModule {
}
(3)创建具体的示例
//第一步 添加@Module 注解
@Module
public class MainModule {
//第二步 使用Provider 注解 实例化对象
@Provides
A providerA() {
return new A();
}
}
(4)创建一个Component
//第一步 添加@Component
//第二步 添加module
@Component(modules = {MainModule.class})
public interface MainComponent {
//第三步 写一个方法 绑定Activity /Fragment
void inject(MainActivity activity);
}
(5)Rebuild Project
然后AS 会自动帮我们生成一个
开头都是以Dagger开始的