Dagger2学习笔记2(学习Dagger2的简单使用)

关于依赖注入的理解: 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~

你可能感兴趣的:(Dagger2学习笔记2(学习Dagger2的简单使用))