Dagger1依赖注入


dagger官方文档
dagger1 git

1.概述

依赖注入(Dependency Injection)具体含义是:

当某个角色(一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在依赖注入器中,创建被调用者的工作不再由调用者来完成(控制反转)
Dagger作为工厂类的替代品,声明依赖、指定如何满足依赖、主导应用程序。基于JSR-330,方便每个类测试。依赖注入不仅仅用于测试,还便于创建可重用、可替换的模块。可在所有应用程序中共享相同的AuthenticationModule(验证模块),可在开发期间运行DevLoggingModule(开发者登录模块),并在生产环境中运行ProdLoggingModule(用户登录模块),以在每种场景下获得正确的行为

2.DECLARING DEPENDENCIES(声明依赖)

使用 javax.inject.Inject 注解来识别构造函数和属性:
(1)使用@Inject注解类的构造函数,当依赖注入构建实例时,Dagger会获得所需的参数值并调用此构造函数

import javax.inject.Inject;

class Thermosiphon implements Pump {
   
   
  private final Heater heater;

  @Inject
  Thermosiphon(Heater heater) {
   
   
    this.heater = heater;
  }

  @Override public void pump() {
   
   
    if (heater.isHot()) {
   
   
      System.out.println("=> => pumping => =>");
    }
  }
}

(2)Dagger直接注入属性:

import dagger.Lazy;
import javax.inject.Inject;

class CoffeeMaker {
   
   
  @Inject Lazy<Heater> heater; 
  @Inject Pump pump;

  public void brew() {
   
   
    heater.get().on();
    pump.pump();
    System.out.println(" [_]P coffee! [_]P ");
    heater.get().off();
  }
}

若类中有@Inject注解在属性上,但没有构造函数使用@Inject注解,Dagger会使用无参数构造函数(存在无参构造函数)。

Dagger不支持方法注入。

3.满足依赖关系(SATISFYING DEPENDENCIES)

默认情况下,Dagger通过构造符合类型的实例来满足每个依赖。
当请求注入一个CoffeeMaker时,通过调用new CoffeeMaker()并设置可注入的属性。
@Inject并不适用于所有地方:
接口不能被构造;
第三方类不能被注解;
必须配置可配置对象。

对于不适用@Inject的情况,使用@ Provides注解方法来满足依赖。方法的返回类型定义了它所满足的依赖项。
在任何需要Heater的时候,调用provideHeater()方法
在这里插入图片描述

@Provides注解的方法可能有自己的依赖。当需要Pump 时,返回Thermosiphon :
在这里插入图片描述
所有@Provides注解的方法必须在一个模块中,有@Module标准的类
在这里插入图片描述
按照惯例,@Provides注解的方法方法名使用前缀provide,而模块类的类名使用后缀Module。

4.建图(BUILDING THE GRAPH)

@Inject和@ Provides注释的类形成了一张通过依赖连接的对象图。通过调用ObjectGraph.create()获得此图,该函数接受一个或多个模块作为参数:
在这里插入图片描述
为了使用图,需要引导注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值