Android Dagger2学习

gradle配置和dagger2 导入

这个配置和AndroidAnnotation 配置相似,都需要配置apt 插件

  • 首先打开项目的 build.gradle,添加如下代码,可能apt 插件会有升级
dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
  • 打开Module 中的build.gradle,添加如下代码
apply plugin: 'com.neenbedankt.android-apt'

apt {
    arguments {
        androidManifestFile variant.outputs[0].processResources.manifestFile
        resourcePackageName 'com.bobomee.dagger2demo'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

    apt 'com.google.dagger:dagger-compiler:2.0'
    compile 'com.google.dagger:dagger:2.0'
    provided 'javax.annotation:jsr250-api:1.0'
}

Dagger2 注解

  • @Inject在需要依赖的地方使用这个注解,告诉Dagger这个类或者字段需要依赖注入
class Thermosiphon implements Pump {
  private final Heater heater;

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

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

  ...
}
  • @Provides 在@Module 中,我们定义的方法用这个注解,用于告诉 Dagger 我们需要构造实例并提供依赖.所有的Provide方法必须属于Module
@Provides Heater provideHeater() {
  return new ElectricHeater();
}
  • @Module用于专门提供依赖,里面提供了一系列provide方法,用于告诉Dagger 去哪里找到这些依赖
@Module
class DripCoffeeModule {
  @Provides Heater provideHeater() {
    return new ElectricHeater();
  }

  @Provides Pump providePump(Thermosiphon pump) {
    return pump;
  }
}
  • @Component 是@Inject和@Module的桥梁,需要列出所有的@Modules以组成该组件.In Dagger 2, that set is defined by an interface ,这是和Dagger1 有区别的
@Component(modules = DripCoffeeModule.class)
interface CoffeeShop {
  CoffeeMaker maker();
}
  • @Scope 注解作用域,通过自定义注解限定对象的作用范围,(如@PerActivity自定义注解,限定对象的存活时间和Activity一致)
    Since Dagger 2 associates scoped instances in the graph with instances of component implementations, the components themselves need to declare which scope they intend to represent
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {
}
@PerActivity
@Component(dependencies = ActivityComponent.class, modules = ContainerModule.class)
public interface ContainerComponent {
    void inject(MainActivity mainActivity);
}

@Singleton 单例,使用@Singleton注解之后,对象只会被初始化一次,之后的每次都会被直接注入相同的对象,@Singleton 就是一个内置的作用域

@Provides @Singleton Heater provideHeater() {
  return new ElectricHeater();
}
  • @Qualifier 限定符,当@Inject不能通过类的类型来鉴别一个 依赖的时候,会使用到(如@ForApplication 和 @ForActivity,分别代表 Application和Activity的Context)
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Named {
  String value() default "";
}
class ExpensiveCoffeeMaker {
  @Inject @Named("water") Heater waterHeater;
  @Inject @Named("hot plate") Heater hotPlateHeater;
  ...
}
  • Lazy injections 懒加载
    Sometimes you need an object to be instantiated lazily. For any binding T, you can create a Lazy which defers instantiation until the first call to Lazy’s get() method.
class GridingCoffeeMaker {
  @Inject Lazy<Grinder> lazyGrinder;

 ...
}
  • Provider injections 提供注入
    multiple instances to be returned instead of just injecting a single value.

参考:
Dagger2 官方文档
使用Dagger 2进行依赖注入
详解Dagger2翻译自:Tasting Dagger 2 on Android

你可能感兴趣的:(android,Dagger2)