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注釋只生成一個實例,可以讓多個線程共享一個實例,以上兩種方式寫法都可以