Dagger
Dagger是一种应用于Android和Java的快速依赖注入框架。
下载
使用Android Studio
compile 'com.squareup.dagger:dagger:1.2.2'
apt 'com.squareup.dagger:dagger-compiler:1.2.2'
为了使apt能够工作,需要在module下的build.gradle中加入
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.6'
}
}
然后在app下的build.gradle中引入
apply plugin: 'com.neenbedankt.android-apt'
使用方法
1、声明依赖
使用@Inject去标注一个类的构造函数,在你需要使用这个类的时候,dagger就会帮你去获取
构造函数所需要的参数实例,并且执行构造函数,实例化这个类。
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
dagger能够直接对成员变量进行依赖注入:
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
如上面,heater域已经持有Heater的一个实例,pump域也持有Pump的一个实例,就是都已经实例化了。
如果你的类中有成员变量使用了@Inject注解,但是构造函数没有使用@Inject注解,那么dagger会
使用无参的构造函数进行实例化。
Dagger不支持方法级别的注入。
2、@Inject并不是什么时候都能够很好地工作。
比如下面几个场景:
接口不能够被实例化
第三方的类库不能使用注解
可配置的对象必须被配置
对于上面这些类,@Inject就不能很好地工作了,这时候可以使用@Provides注解去声明
依赖关系。此方法返回所需要的类型。
@Provides Heater provideHeater() {
return new ElectricHeater();
}
无论任何时候需要Heater,provideHeater()都会返回一个ElectricHeater实例。
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
对于上面这种,当需要一个Pump时,需要依赖Thermosiphon,Thermosiphon的实例一样是通过dagger的
依赖注入构建的。
所有被@Provides标注的方法必须属于一个module。一个module可以是被@Module标注的类。
@Module
class DripCoffeeModule {
@Provides Heater provideHeater() {
return new ElectricHeater();
}
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
}
一般地,这个module类以Module为后缀,@Provides标注的方法以provide为前缀。
3、构建对象图表
@Inject和@Provide注解组成一个对象图表,初始化对象图表可以使用ObjectGraph.create(),参数
可以是一个或者多个module。
ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
可以在Application类中初始化对象图表,构建整个app的依赖关系。
class CoffeeApp implements Runnable {
@Inject CoffeeMaker coffeeMaker;
@Override public void run() {
coffeeMaker.brew();
}
public static void main(String[] args) {
ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
CoffeeApp coffeeApp = objectGraph.get(CoffeeApp.class);
...
}
}
为了使图表能够识别CoffeeApp,需要在@Module注解中注册。
@Module(
injects = CoffeeApp.class
)
class DripCoffeeModule {
...
}
4、单例模式
在一个类级别上或者标注了@Provide的方法上使用@Singleton,dagger的图表就会为当前的对象使用
单例。
@Provides @Singleton Heater provideHeater() {
return new ElectricHeater();
}
@Singleton
class CoffeeMaker {
...
}
5、懒注入
可以使用Lazy,直到get()方法第一次调用才会进行注入。
class GridingCoffeeMaker {
@Inject Lazy<Grinder> lazyGrinder;
public void brew() {
while (needsGrinding()) {
// Grinder created once on first call to .get() and cached.
lazyGrinder.get().grind();
}
}
}
6、文档 http://square.github.io/dagger/
github地址 https://github.com/square/dagger