关于: https://google.github.io/dagger/users-guide
Dagger是代替了工厂,实现了依赖注入的设计模式。Dagger2实现了全栈生成代码,和Dagger相比,使依赖注解更简单。
一、配置
在project build.gradle中
dependencies { classpat'com.neenbedankt.gradle.plugins:android-apt:1.8'}
app build.gradle中
apply plugin: 'com.neenbedankt.android-apt'
dependencies{
compile 'com.google.dagger:dagger:2.0.2'
compile 'com.google.dagger:dagger-compiler:2.0.2'
provided 'org.glassfish:javax.annotation:10.0-b28'
}
lintOptions {//变异时报错的提示
warning 'InvalidPackage'
}
二、注解
@Inject: 这个类或者字段需要依赖注入。Dagger就会构造一个这个类的实例。
不可以使用在:
接口不可以被构造
第三方类不能被注释
@Provide:如果@Inject不满足,使用 @Provide注释方法满足依赖(提供的也是构造所需的对象)。所有的@Provides方法必须属于一个 module,在类上面添加 @Module。
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
@Component: 注入器,@Inject和@Module的桥梁,连接这两个部分。 使用 @Component注解在接口上,通过(modules = DripCoffeeModule.class)中类型,去对应类中得到所需注册的对象。
对应接口的前缀是Dagger。获得接口实例:
①通过builder()唤醒接口,返回的Builder设置依赖,–> build() 创建一个新的实例。
②使用create()创建一个新的实例。
@Scope:Dagger2可以通过自定义注解限定注解作用域。我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度。
Qualifier: 当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。
在Model中找创建对象的方法,没有走类的构造方法。