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 1.Dagger2是一个依赖注入框架。如果Class A 内部 有一个Class B,我们称...
    天天大保建阅读 992评论 0 1
  • 1.什么是dagger2 简单来说,dagger2是一个依赖注入框架,代替你生成实例,管理各种实例的依赖关系的库。...
    碧海鱼龙阅读 1,016评论 0 0
  • 最近在项目中使用了 Dagger2 这个依赖注入的框架,在这里记录一下。第一次写技术文章,不足之处请多指教。不过真...
    lshilll阅读 1,499评论 0 0
  • Dagger简单使用 要实现注入,至少需要@Component可以简单理解为注入器,由它将需要注入和对象实例提供连...
    奋斗的Leo阅读 950评论 2 4
  • 前言 2018年,大家开心哈,本文是在2018年第一天写完的,历时一年才完成,哈哈2018,大家加油 目录 一:D...
    Allens_Jiang阅读 69,266评论 48 132