1.什么是依赖注入
DI ,简单的讲,讲对象创建的过程交给容器,在需要的时候直接去拿,而不是代码中创建。是ioc的一种实现方式。
在 Java 领域中,我们就有 Spring、Guice 以及最近的 Dagger。
参考这篇文章:依赖注入和控制反转的理解,写的太好了
2.为什么使用这个技术
1.降低代码之间的耦合,主要是一个类中创建另一个类,构成相互依赖的情况。
2.便于测试
3.Android 中的注入框架
3.1 Dragger2
3.1.1 介绍
Dagger 得名于树状结构的依赖。能更准确地记住这是个依赖图,实际上是有向无环图,或者说是 DAG,因此取名为 DAGger。
Google 的一个团队还是决定做些改进,所以他们创造了 Dagger 2。
Dagger 2在编译时完成了更多的工作,也很好地移除了反射,最后还能生成比最初版本Dagger 更容易调试的代码。
它使得开发效率更高,省去创建对象的过程,代码充分解耦,同时可以更好的管理生命周期
_3.1.2 使用介绍
@Compone inject 和Module的桥梁,是一个接口,定义了需要实例的类型;
@inject Dragger2会构造它的实例以满足依赖的需求;
@Module 将一个类进行module注解,编译器就会在这个类进行查找需要的依赖实例。多个module相互分离,组合在一起使用;
@Provide 在module内使用,告诉编译器需要如何进行构造;
@Scope 非常强大的功能,可以通过自定义注解来管理生命周期,比如使用--------@PerFragment @PerActivity @PerUser等;
@Qualifier 当注入的参数不足以满足依赖的时候使用,比如context ,可以自定义qualifier annotation 比如 @ForActiivty,@ForApplication
@Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用(Dagger2通过Inject标记可以在需要这个类实 例的时候来找到这个构造函数并把相关实例new出来)从而提供依赖,另一个作用就是标记在需要依赖的变量让Dagger2为其提供依赖。
@Provide 用Provide来标注一个方法,该方法可以在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Injection的变量赋值。provide主要用于标注Module里的方法
@Module 用Module标注的类是专门用来提供依赖的。有的人可能有些疑惑,看了上面的@Inject,需要在构造函数上标记才能提供依赖,那么如果我们需要提供 的类构造函数无法修改怎么办,比如一些jar包里的类,我们无法修改源码。这时候就需要使用Module了。Module可以给不能修改源码的类提供依 赖,当然,能用Inject标注的通过Module也可以提供依赖
@Component Component一般用来标注接口,被标注了Component的接口在编译时会产生相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁,把相关依赖注入到其中。
3.3.3 くぞ
① build.gradle
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
dependencies {
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0'
provided 'javax.annotation:jsr250-api:1.0'
...
}
②浅析Dagger2的使用
Dagger2 最清晰的使用教程
_1.@inject @component
_2.@provided @module
3.2 Butterknife
3.2.1 介绍
3.2.2 使用
Reference
Android中的依赖注入
Tasting Dagger 2 on Android
dragger2-git-sample
Android注解快速入门和实用解析
网友评论