关于依赖注入的理解: http://www.jianshu.com/p/9f1f1e75e97c
前言:
上篇文章中我们主要介绍了什么叫做依赖注入,为了代码解耦, 我们在编程的时候会尽量使用. 而Dagger2就是一种进行依赖注入的利器,本文将主要学习 Dagger2的基础使用方法.
概念: Dagger2是由 google 维护, 在编译期间自动生成依赖代码, 对依赖对象进行创建.
dagger2资料:
Github:https://github.com/google/dagger
官方文档:https://google.github.io/dagger//
API:http://google.github.io/dagger/api/latest/
引入 Dagger2
在 App 的 build.gradle 文件中引入 Dagger2
dependencies {
.....
compile 'com.google.dagger:dagger:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
}
Dagger2的使用:
dagger2的使用主要是对依赖对象进行创建, 而我们的目的就是不通过依赖的方式获取到对象.接下来dagger2中获取对象主要通过两种方式:
方式1:
通过@ inject 注解修饰构造方法
public class Dog {
private String color;
@Inject
public Dog(){}
....
}
我们在调用的时候,比如在 acitivity中@inject 申明dog即可;
public class MainActivity extends AppCompatActivity {
@Inject
Dog dog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.builder().mainModule(new MainModule()).build().inject(this);
dog.setColor("yellow");
}
}
方式2:
第二种方法较为复杂, 先创建一个用@Moudle 注解的类, 这个类是为 dagger 依赖类供货的, 里面通过@Provides 注解提供了一个Dog对象,
这是第一步, 代码如下:
@Module
public class MainModule {
@Provides
public Dog provideDog(){
return new Dog();
}
接下来需要一个@Compenent注解修饰的接口类, 这个类相当于一个媒婆, 把依赖注入到需要依赖的地方, 把 Moudle 类中提供依赖对象和我们需要注入依赖的类进行关联, 现在我们MainActivity 中需要 MainModule 中的 dog 类,代码如下
@Component(modules= MainModule.class)
public interface MainComponent {
void inject(MainActivity mainActivity);
}
调用 Dog 时和上边的方法相同, 心细的同学已经发现了, 我们看到了一行 inject 注入的代码(Component类写完 build 之后, Dagger 会为我们自动生成一个以 Dagger 开头的 Component 类结尾的类), 不管是第一种获得依赖对象的方法还是第二种,我们都需要能让Dagger2在需要注入时找到这个工具, 具体为什么这么写,我们会在后期讲解注解标签的时候说明, 现在先明确一下需要这么做.
DaggerMainComponent.builder().mainModule(new MainModule())
.build().inject(this);
另外,两种方式也可以混合使用:
Dogs 的构造方法使用 inject 注解,参数为 dog
public class Dogs {
private Dog dog;
@Inject
public Dogs(Dog dog){
this.dog = dog;
}
public String getDogColor() {
return dog.getColor();
}
}
Dog 为一个普通类
public class Dog {
private String color;
public Dog() {
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
在 MainModule 中, 使用 Provide 注解提供了一个 Dog 类的依赖
@Module
public class MainModule {
@Provides
Dog provideDog(){
Dog dog = new Dog();
dog.setColor("yellow");
return dog;
}
}
我们在 MainActivity 中需要 Dogs 类,进行依赖注入, 最终可以得到 dog 的颜色
public class MainActivity extends AppCompatActivity {
@Inject
Dogs dogs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent.builder().mainModule(new MainModule())
.build().inject(this);
Toast.makeText(this,dogs.getDogColor(),Toast.LENGTH_SHORT).show();
}
}
从上述代码中可以看出 Dogs 类是通过 inject 修饰构造方法进行实例化, 但是构造方法中又有一个参数Dog, 这时 Dagger会去提供依赖的MainModule()查找有没有符合需求的依赖, 然后就找到了provideDog方法, 获取参数 dog, 从而完成 Dogs 的依赖.
Dagger2提供依赖规则:
step1: 在相关的Module类中查找有没有提供创建该类的方法
step2: 如果有,查看是否有参数
- step2.1: ,有参数则从 step1开始找该参数类的创建方法
- step2.2: 如没有参数, 则完成一次依赖注入
step3: 如果Module类中没有相关的, 则去查看这个类用inject 注解的相关构造方法,查看构造方法是否有参数
- step3.1: 如果有参数则重复 step1
- step3.2:如果没有参数则完成一次依赖注入
接下来我们将学习Dagger2中各个注解的作用及使用
Dagger2学习笔记3(各个注解学习)
Dagger2学习笔记4(@Singleton 与@ Scope 实现全局单例与作用域单例)
致谢: http://www.jianshu.com/p/1d84ba23f4d2
感谢大神提供神作!~
随便写写笔记, 反正也不会有人看, End~