美文网首页
Dagger2使用

Dagger2使用

作者: cookie口 | 来源:发表于2017-01-09 16:48 被阅读10次
    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使用

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