github: https://github.com/google/dagger
guide: https://google.github.io/dagger/users-guide
配置repositories, 使用maven中心仓
allprojects {
repositories {
mavenCentral()
google()
}
}
或使用阿里maven仓
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
app build.gradle 添加依赖
implementation 'com.google.dagger:dagger:2.16'
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
声明依赖
使用@Inject 声明 dagger生成实例时,应该使用的构造函数
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
使用@Inject 声明需要被注入的成员
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
注入依赖
默认dagger使用@Inject声明的构造器 实例化一个依赖类。
但@Inject在下面几种情况无法使用:
- 接口, 没有构造器
- 第三方类库中的类, 无法在源码中添加注解。
- 需要配置的类, 对象实例化后需要一些额外的配置步骤。
这些情况需要使用@Provider
@Provides static Heater provideHeater() {
return new ElectricHeater();
}
返回值代表提供的对象类型。
所有@Provider方法必须包含在@Module中。
@Module
class DripCoffeeModule {
@Provides static Heater provideHeater() {
return new ElectricHeater();
}
@Provides static Pump providePump(Thermosiphon pump) {
return pump;
}
}
声明module类
@Component(modules = DripCoffeeModule.class)
interface CoffeeShop {
CoffeeMaker maker();
}
dagger生成以Dagger开头的实现类DaggerCoffeeShop。
显示新建module,配置component。如果没有设置,则dagger使用默认构造函数新建module,来配置component。
CoffeeShop coffeeShop = DaggerCoffeeShop.builder()
.dripCoffeeModule(new DripCoffeeModule())
.build();
如果module中,@Provider方法全部是静态,则不需要module的实例对象。所以,可以直接使用:
CoffeeShop coffeeShop = DaggerCoffeeShop.create();
至此,可以通过module对象获取到 需要的对象。
public class CoffeeApp {
public static void main(String[] args) {
CoffeeShop coffeeShop = DaggerCoffeeShop.create();
coffeeShop.maker().brew();
}
}
网友评论