最简单的应用
- 配置环境在根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:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束