目录
- 一:Dagger2是什么?
- 二:为什么要有Dagger2
- 三:Dagger2如何使用
-
- 基本的概念
-
- 如何使用Dagger2
-
- 高级用法
- (1)构造方法需要其他参数时候
- (2) 模块之间的依赖关系
- (3) @Named注解使用
- (4) @Singleton注解
- (5)自定义Scoped
- (6)Subcomponent
- (7)lazy 和 Provider
-
- 四: MVP + Dagger2
一: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开始的
(6)将Component与Activity/Fragment绑定关系
package com.allens.daggerdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.allens.daggerdemo.Bean.A;
import com.allens.daggerdemo.component.DaggerMainConponent;
import javax.inject.Inject;
public class MainActivity extends AppCompatActivity {
/***
* 第二步 使用Inject 注解,获取到A 对象的实例
*/
@Inject
A a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/***
* 第一步 添加依赖关系
*/
//第一种方式
DaggerMainConponent.create().inject(this);
//第二种方式
DaggerMainConponent.builder().build().inject(this);
/***
* 第三步 调用A 对象的方法
*/
a.eat();
}
}
肯定有小伙伴说了,为了拿到一个对象,这么大个弯,太麻烦了。别急慢慢看,路要一步一步走嘛
————————分割线————————
如果你看到了这里,觉得文章写得不错就给个关注呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能关注下我,以后还会更新技术干货,谢谢您的支持!
转发分享+关注,每天获取更多资料
Android架构师之路很漫长,一起共勉吧!