Dagger2使用

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注释只生成一个实例,可以让多个线程共享一个实例,以上两种方式写法都可以

你可能感兴趣的:(Dagger2使用)