Dagger2 基础 (一)

最简单的应用

  1. 配置环境在根gradle中
dependencies {
     ... 
     // 其他classpath
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令
 }
在App.gradle中

dependencies {
  compile 'com.google.dagger:dagger:2.x'
  apt 'com.google.dagger:dagger-compiler:2.x'
  provided 'javax.annotation:jsr250-api:1.0'
}
 2.使用@Inject注入
public class RestApiStore {
  public String s;

  @Inject
  public RestApiStore (){
    s = "12";
  }
}
//activity中
@Inject RestApiStore apiStore;
3.使用module注入
//Module类
@Module
public class MainActivityModule {

  @Provides
  RestApiStore provideApiStore(){
    return new RestApiStore();
  }
}

//component类
@Component(MainActivityModule.class)
public interface MainActivityComponent {
  void inject(MainActivity mainActivity);
}

//activity中
@Inject RestApiStore apiStore;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DaggerMainActivityComponent.builder().build().inject(this);
  }

以上是两种最基本的Dagger2用法。

总结

Inject,Component,Module,Provides是dagger2中的最基础最核心的知识点。奠定了dagger2的整个依赖注入框架。
Inject主要是用来标注目标类的依赖和依赖的构造函数
Component它是一个桥梁,一端是目标类,另一端是目标类所依赖类的实例,它也是注入器(Injector)负责把目标类所依赖类的实例注入到目标类中,同时它也管理Module。
Module和Provides是为解决第三方类库而生的,Module是一个简单工厂模式,Module可以包含创建类实例的方法,这些方法用Provides来标注
这里写图片描述

注意@Inject并不是万能,对于未知的事物,还是无能为力的。比如,所熟悉的接口,接口并不能创建实例,这时,我们就不能使用@Inject注解。

  • 接口不能够创建
  • 第三方库的类不能够创建
  • 配置对象必须配置!

如果两种注入方式都存在,则按以下规则进行

步骤1:查找Module中是否存在创建该类的方法。
步骤2:若存在创建类方法,查看该方法是否存在参数
步骤2.1:若存在参数,则按从步骤1开始依次初始化每个参数
步骤2.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束
步骤3:若不存在创建类方法,则查找Inject注解的构造函数,看构造函数是否存在参数
步骤3.1:若存在参数,则从步骤1开始依次初始化每个参数
步骤3.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束

github地址:https://github.com/zhangyuesx215/Dagger2-MVP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章