1.@Inject
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
在构造函数上加上@Inject 创建实例
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
在变量上加@Inject会向该变量注入实例
但@ inject并不是到处都能用:
1)接口不能构造。
2)第三方类不能注释。
3)可配置的对象必须配置!
这个时候怎么办呢?别急Dagger2向我们提供了@Provides注解来满足这些需求。
2.@Provides
@Provides
static Heater provideHeater() {
return new ElectricHeater();
}
返回对象,会自动注入带有@Inject注入的变量
所有的@Provides方法必须属于module类中,module类必须加上注解@Module
3.@Module
@Module
class DripCoffeeModule {
@Provides
static Heater provideHeater() {
return new ElectricHeater();
}
@Provides
static Pump providePump(Thermosiphon pump) {
return pump;
}
}
module类是提供依赖对象的地方
那现在有提供依赖对象的,有注入的,那怎么把这俩连接起来呢?
Dagger2提供了一个@Component注解,把这两者连接起来。
Dagger2创建实例顺序
第一:先在Module中看看有没@Provides注解的方法提供所需的对象,有则返回,没有进入第二步
第二:在@Inject注解中查找所需的对象
4.@Component
@Component(modules = DripCoffeeModule.class)
interface CoffeeShop {
CoffeeMaker maker();
}
@Component定义的接口起一个连接作用,就是把module和inject连接起来。
@Component(module = 提供依赖的类)
CoffeeShop coffeeShop = DaggerCoffeeShop.builder() .dripCoffeeModule(new DripCoffeeModule()).build();
创建Component实例告诉dagger2所需的module
5.@Singleton
@Provides @Singleton
static Heater provideHeater() {
return new ElectricHeater();
}
@Singleton
class CoffeeMaker {
...
}
@Singleton注释只生成一个实例,可以让多个线程共享一个实例,以上两种方式写法都可以