Dagger2的使用
导入
1.在 Project 的 build.gradle 文件添加 apt 工具的 gradle 插件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
// 添加 apt
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
2.在 Module 的 build.gradle 文件引入 apt 插件和 dagger2
apply plugin: 'com.android.application'
// 引入 apt 插件
apply plugin: 'com.neenbedankt.android-apt'
......
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:24.2.1'
// 添加 dagger2
compile 'com.google.dagger:dagger:2.6'
apt 'com.google.dagger:dagger-compiler:2.6'
}
compile 'com.google.dagger:dagger:2.6'
是导入依赖的 dagger 相关的类
apt 'com.google.dagger:dagger-compiler:2.6'
是使用 apt 工具在编译的时候自动产生依赖注入相关代码,apt 会在编译的时候运行 dagger-compiler 里面的代码,来自动产生依赖注入相关的代码
apply plugin: 'com.neenbedankt.android-apt'
应用 apt gradle 插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
添加 apt 插件
使用
四个注解:@inject @module @provides @Component
@inject 指定需要注入的目标
//指定的注入目标 在执行注入后 即可直接获取对象
@Inject
MainActivityPresenter presenter;
@module 指定创建对象的类
@provides 指定创建对象的方法
//一般@module 会和@provides配合使用 作为提供对象的方式
@Module
public class MainActivityModule {
@Provides
public MainActivityPresenter MainActivityPresenterPrivider() {
return new MainActivityPresenter();
}
}
@Component
//@componet 类似于等号的关系 把注入的目标和 提供的的对象关联起来提供一个注入方法 进行关联
@Component(modules = MainActivityModule.class)
public interface MainActivityComponent {
void in(MainActivity activity);
}
rebuild 之后会根据类名生成一个对应的代码(就是apt帮生成的)
//名字如:DaggerMainActivityComponent
DaggerMainActivityComponent.builder().mainActivityModule(new MainActivityModule()).build().in(this);
//这样你在上面是有@inject注解的目标 就有值了 就可以使用了