什么是Dagger2?
Dagger2是Dagger的升级版,是一个依赖注入框架,现由Google接手维护。 先需理解什么是依赖注入,才能更好的理解Dagger2。
依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。
例如:我们在写Android程序时,在一个类中引用另一个类,从而可以调用引用的类的方法完成某些功能 ;
ListView、RecyclerView大家都是有接触过的,其中Adapter创建好之后,若在Activity的类中进行使用,需要通过构造方法进行调用引用,有时候我们并不能把所有参数都考虑周全,把适配器写好,若适配器可以复用或产品迭代需要新的参数时,往往修改一个地方,其它地方可能也要面临大改,为了降低这种高频的程序耦合(解耦),Dagger2很好的解决了我们实际开发中的问题。
public class ClassA { ... ClassB b; ... public ClassA() { b = new ClassB(); } public void do() { ... b.doSomething(); ... } }
换句话也就是说,ClassA依赖于ClassB,必须借助ClassB的方法,才能完成一些功能。这样看好像并没有什么问题,但是我们在ClassA的构造方法里面直接创建了ClassB的实例,问题就出现在这,在ClassA里直接创建ClassB实例,违背了单一职责原则,ClassB实例的创建不应由ClassA来完成;其次耦合度增加,扩展性差,如果我们想在实例化ClassB的时候传入参数,那么不得不改动ClassA的构造方法,不符合开闭原则。
因此我们需要一种注入方式,将依赖注入到宿主类(或者叫目标类)中,从而解决上面所述的问题。依赖注入有一下几种方式:
interface ClassBInterface { void setB(ClassB b); } public class ClassA implements ClassBInterface { ClassB classB; @override void setB(ClassB b) { classB = b; } }
☆通过set方法注入
public class ClassA { ClassB classB; public void setClassB(ClassB b) { classB = b; } }
☆通过构造方法注入
public class ClassA { ClassB classB; public void ClassA(ClassB b) { classB = b; }
public class ClassA { //此时并不会完成注入,还需要依赖注入框架的支持,如RoboGuice,Dagger2 @inject ClassB classB; ... public ClassA() {}
其中,在Dagger2中引用的就是最后的一种注入方式,通过注解的方式,将依赖注入到宿主类中。
如何使用Dagger2?
☆配置apt插件(在build.gradle(Project:xxx)中添加如下代码)
dependencies { classpath 'com.android.tools.build:gradle:2.1.0' //添加apt插件 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }
☆添加依赖(在build.gradle(Module:app)中添加如下代码)
apply plugin: 'com.android.application' //添加如下代码,应用apt插件,添加apt命令 apply plugin: 'com.neenbedankt.android-apt' ... dependencies { ... //dagger2 compile 'com.google.dagger:dagger:2.4' //dagger公用api apt 'com.google.dagger:dagger-compiler:2.4' //指定注解处理器 compile 'org.glassfish:javax.annotation:10.0-b28' //java注解 添加Android缺失的部分Javax注解 ... }
注意:Android Studio 3.0 干掉了apt,详情请点击——》
Android Studio升级至3.0所遇到的问题
你该知道:
@Inject:
通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module:
Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例时候,就知道从哪里去找到需要的依赖。Modules的一个重要特征是他们设计为分区并组合在一起(比如说,我们的app中可以有多个组成在一起的modules)。
@Provide:
在modules中,我们定义的方法时用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component:
Commponents从根本上说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的。
注解 | 用法 |
---|---|
@Module | Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules) |
@Provide | 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。 |
@Singleton | 当前提供的对象将是单例模式 ,一般配合@Provides 一起出现 |
@Component | 用于接口,这个接口被Dagger2用于生成用于模块注入的代码 |
@Inject | 在需要依赖的地方使用这个注解。(你用它告诉Dagger这个 构造方法,成员变量或者函数方法需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。) |
@Scope | Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。 |
内容源自网络,仅供学习参考,待完善~~~