美文网首页
Dagger2基础

Dagger2基础

作者: 小小爱笑 | 来源:发表于2018-09-02 01:35 被阅读0次

    github: https://github.com/google/dagger
    guide: https://google.github.io/dagger/users-guide

    配置repositories, 使用maven中心仓

    allprojects {
        repositories {
            mavenCentral()
            google()
        }
    }
    

    或使用阿里maven仓

    maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
    

    app build.gradle 添加依赖

    implementation 'com.google.dagger:dagger:2.16'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
    

    声明依赖

    使用@Inject 声明 dagger生成实例时,应该使用的构造函数

    class Thermosiphon implements Pump {
      private final Heater heater;
    
      @Inject
      Thermosiphon(Heater heater) {
        this.heater = heater;
      }
    
      ...
    }
    

    使用@Inject 声明需要被注入的成员

    class CoffeeMaker {
      @Inject Heater heater;
      @Inject Pump pump;
    
      ...
    }
    

    注入依赖

    默认dagger使用@Inject声明的构造器 实例化一个依赖类。
    但@Inject在下面几种情况无法使用:

    • 接口, 没有构造器
    • 第三方类库中的类, 无法在源码中添加注解。
    • 需要配置的类, 对象实例化后需要一些额外的配置步骤。

    这些情况需要使用@Provider

    @Provides static Heater provideHeater() {
     return new ElectricHeater();
    }
    

    返回值代表提供的对象类型。
    所有@Provider方法必须包含在@Module中。

    @Module
    class DripCoffeeModule {
      @Provides static Heater provideHeater() {
        return new ElectricHeater();
      }
    
      @Provides static Pump providePump(Thermosiphon pump) {
        return pump;
      }
    }
    

    声明module类

    @Component(modules = DripCoffeeModule.class)
    interface CoffeeShop {
      CoffeeMaker maker();
    }
    

    dagger生成以Dagger开头的实现类DaggerCoffeeShop。
    显示新建module,配置component。如果没有设置,则dagger使用默认构造函数新建module,来配置component。

    CoffeeShop coffeeShop = DaggerCoffeeShop.builder()
        .dripCoffeeModule(new DripCoffeeModule())
        .build();
    

    如果module中,@Provider方法全部是静态,则不需要module的实例对象。所以,可以直接使用:

    CoffeeShop coffeeShop = DaggerCoffeeShop.create();
    

    至此,可以通过module对象获取到 需要的对象。

    public class CoffeeApp {
      public static void main(String[] args) {
        CoffeeShop coffeeShop = DaggerCoffeeShop.create();
        coffeeShop.maker().brew();
      }
    }
    

    相关文章

      网友评论

          本文标题:Dagger2基础

          本文链接:https://www.haomeiwen.com/subject/fyxpwftx.html